2

私はこれらの5つのテーブルを持っています:

REF_CT          REF_CT_L        REF_ST        REF_ST_L
======          ========        ======        ========
CT_ID           CT_ID           ST_ID         ST_ID
ST_ID           LANGUAGE_ID     NAME          LANGUAGE_ID
NAME            NAME            REF_CODE      NAME
REF_CODE        DESCRIPTION                   DESCRIPTION


REF_LANGUAGE
============
LANGUAGE_ID
LOCALE_CODE
NAME

JPAを使用して、次の3つのエンティティクラスを作成しました。

  1. クラスcommon.contact.City

    @Entity
    @Table(name = "REF_CT")
    @SecondaryTable(name = "REF_CT_L")
    public class City implements Reference {
       @Id
       @Column(name = "CT_ID")
       @TableGenerator(name = "TABLE_GEN", table = "SYS_SEQ",
            pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue =   "CITY_SEQ")
       @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
       private Integer id;
    
       @Column(name = "NAME")
       private String name;
    
       @Column(table = "REF_CT_L", name = "NAME")
       private String value;
    
       @Column(name = "REF_CODE")
       private String refCode;
    
       @ManyToOne(targetEntity = Language.class)
       @JoinColumn(table = "REF_CT_L", name = "LANGUAGE_ID")
       private Language language;
    
       @ManyToOne(targetEntity = State.class, optional = true)
       @JoinColumn(name = "ST_ID", referencedColumnName = "ST_ID")
       private State state;
    
  2. クラスcommon.contact.State

    @Entity
    @Table(name = "REF_ST")
    @SecondaryTable(name = "REF_ST_L")
    public class State implements Reference {
       @Id
       @Column(name = "ST_ID")
       @TableGenerator(name = "TABLE_GEN", table = "SYS_SEQ",
            pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue = "STATE_SEQ")
       @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
       private Integer id;
    
       @Column(name = "NAME")
       private String name;
    
       @Column(table = "REF_ST_L", name = "NAME")
       private String value;
    
       @Column(name = "REF_CODE")
       private String refCode;
    
       @OneToMany(targetEntity = City.class, mappedBy = "state")
       private Set<City> cities;
    
       @ManyToOne(targetEntity = Language.class)
       @JoinColumn(table = "REF_ST_L", name = "LANGUAGE_ID", unique = true, referencedColumnName = "LANGUAGE_ID")
       private Language language;
    
  3. クラスcommon.system.Language

    @Entity
    @Table(name = "SYS_LANGUAGE")
    public class Language implements BaseEntity {
       @Id
       @Column(name = "LANGUAGE_ID")
       @TableGenerator(name = "TABLE_GEN", table = "SYS_SEQ",
            pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_VALUE", pkColumnValue = "LANGUAGE_SEQ")
       @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
       private Integer id;
    
       @Column(name = "LOCALE_CODE")
       private String locale;
    
       @Column(name = "NAME")
       private String name;
    

しかし、私がこのクエリを実行しようとしたとき

select city from City city where city.id = 1 

このエラーが発生します:

org.hibernate.HibernateException: More than one row with the given identifier was found: 10, for class: common.contact.State

参考までに、次のデータが追加されています。

REF_CT

CT_ID    ST_ID    NAME    REF_CODE
=====    =====    ====    ========
  1        10    CHERAS     CHE

REF_CT_L

CT_ID    LANGUAGE_ID    NAME       DESCRIPTION
=====    ===========    ====       ===========
  1           1      BANDAR CHERAS  CHERAS BARU
  1           2      CHERAS TOWN    NEW CHERAS  

REF_ST

ST_ID    NAME     REF_CODE
=====    ====     ========
  10    SELANGOR    SEL

REF_ST_L

ST_ID    LANGUAGE_ID     NAME      DESCRIPTION
=====    ===========     ====      ===========
  10          1        SELANGOR    SELANGOR BARU
  10          2        SERIANGOR   NEW SERIANGOR

REF_LANGUAGE

LANGUAGE_ID    LOCALE_CODE    NAME
===========    ===========    ====
     1           ms_En       Malay
     2           en_US       English

生成されたSQLは次のとおりです。

SELECT state0_.st_id AS st1_50_0_,
       state0_.NAME AS name50_0_, state0_.ref_code AS ref4_50_0_,
       state0_1_.language_id AS language2_51_0_, state0_1_.NAME AS name51_0_
  FROM ref_st state0_ LEFT OUTER JOIN ref_st_l state0_1_
       ON state0_.st_id = state0_1_.st_id
 WHERE state0_.st_id = 10;

ご協力いただきありがとうございます!

4

2 に答える 2

0

"REF_ST" は "REF_ST_L" と 1 対多の関係にあります。これは、「REF_ST_L」をセカンダリ テーブルとしてマップできないことを意味します (これは、1 対 1 の関係を意味します)。

"REF_CT" -> "REF_CT_L" についても同じ論理が有効です。

于 2013-09-06T14:07:35.787 に答える
0

City -> State 関係をオプションとして設定したため、コードは LEFT JOIN を生成しています。null 不可に変更すると、返される複数の行を解決する必要がある内部結合を取得する必要があります。

common.contact.City ->

@ManyToOne(targetEntity = State.class, optional = false)
@JoinColumn(name = "ST_ID", referencedColumnName = "ST_ID", nullable = false)
private State state;
于 2012-08-30T21:30:49.850 に答える