Hibernate OneToMany,天生PK
Hibernate OneToMany, natural PK
我在设置 OneToMany 关系时遇到问题。
我的数据库架构:
TABLE PARENT (
VENDOR,
CHANNEL,
CREATEDATE,
REFID,
...
)
UNIQUE INDEX PK_PARENT (VENDOR, CHANNEL, CREATEDATE, REFID)
TABLE CHILD (
REFID,
NAME,
)
UNIQUE INDEX PK_CHILD (REFID, NAME)
和Javaclass
public class Parent {
String vendor;
String channel;
Date createdate;
Long refid;
List<Child> childs;
...
}
public class Child {
Long refid;
String name;
}
我的问题是我无法为此 classes 开发正确的映射。出于一致的原因,我被迫使用 hbm xml。我能够将其映射为两个独立的实体。
<hibernate-mapping>
<class name="Parent" table="PARENT">
<composite-id >
<key-property name="vendor" type="string">
<column name="VENDOR" />
</key-property>
<key-property name="vendor" type="string">
<column name="CHANNEL" />
</key-property>
<key-property name="vendor" type="Date">
<column name="CREATEDATE" />
</key-property>
<key-property name="vendor" type="Long">
<column name="REFID" />
</key-property>
<composite-id />
<list name="childs" table="CHILD" lazy="true" fetch="select">
<key column="REFID" />
<index column="REFID" />
<one-to-many class="Child" />
</list>
</class>
<class name="Child" table="CHILD">
<composite-id >
<key-property name="vendor" type="Long">
<column name="REFID" />
</key-property>
<key-property name="name" type="string">
<column name="NAME" />
</key-property>
<composite-id />
</class>
</hibernate-mapping>
我遇到异常:
Caused by: org.hibernate.MappingException: Foreign key (FK_9897tr114hxkewktsi9vb92x6:CHILD[REFID])) must have same number of columns as the referenced primary key (PARENT[VENDOR,CHANNEL,CREATEDATE,REFID])
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1818)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1741)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
有什么想法吗?
因为您的子实体有一个复杂的键,因此在父实体中您也需要将外键指定为复杂的。
根据休眠配置 xml 文件中的 java class 字段更改 属性 名称。如果您的 java class 中有一个 "channel" 字段,那么它应该在您的 hbm 配置中命名为 "channel",尽管它是复合主键的一部分。
<class name="Parent" table="PARENT">
<composite-id >
<key-property name="vendor" type="string">
<column name="VENDOR" />
</key-property>
<key-property name="channel" type="string">
<column name="CHANNEL" />
</key-property>
<key-property name="createdate" type="Date">
<column name="CREATEDATE" />
</key-property>
<key-property name="refid" type="Long">
<column name="REFID" />
</key-property>
<composite-id />
<list name="childs" table="CHILD" lazy="true" fetch="select">
<key column="REFID" />
<index column="REFID" />
<one-to-many class="Child" />
</list>
另外,你应该在映射的另一端定义manyToOne关系。在 child class 中可以有一个 Parent 实例。(不仅仅是一个 ID)
我在设置 OneToMany 关系时遇到问题。
我的数据库架构:
TABLE PARENT (
VENDOR,
CHANNEL,
CREATEDATE,
REFID,
...
)
UNIQUE INDEX PK_PARENT (VENDOR, CHANNEL, CREATEDATE, REFID)
TABLE CHILD (
REFID,
NAME,
)
UNIQUE INDEX PK_CHILD (REFID, NAME)
和Javaclass
public class Parent {
String vendor;
String channel;
Date createdate;
Long refid;
List<Child> childs;
...
}
public class Child {
Long refid;
String name;
}
我的问题是我无法为此 classes 开发正确的映射。出于一致的原因,我被迫使用 hbm xml。我能够将其映射为两个独立的实体。
<hibernate-mapping>
<class name="Parent" table="PARENT">
<composite-id >
<key-property name="vendor" type="string">
<column name="VENDOR" />
</key-property>
<key-property name="vendor" type="string">
<column name="CHANNEL" />
</key-property>
<key-property name="vendor" type="Date">
<column name="CREATEDATE" />
</key-property>
<key-property name="vendor" type="Long">
<column name="REFID" />
</key-property>
<composite-id />
<list name="childs" table="CHILD" lazy="true" fetch="select">
<key column="REFID" />
<index column="REFID" />
<one-to-many class="Child" />
</list>
</class>
<class name="Child" table="CHILD">
<composite-id >
<key-property name="vendor" type="Long">
<column name="REFID" />
</key-property>
<key-property name="name" type="string">
<column name="NAME" />
</key-property>
<composite-id />
</class>
</hibernate-mapping>
我遇到异常:
Caused by: org.hibernate.MappingException: Foreign key (FK_9897tr114hxkewktsi9vb92x6:CHILD[REFID])) must have same number of columns as the referenced primary key (PARENT[VENDOR,CHANNEL,CREATEDATE,REFID])
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1818)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1741)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
有什么想法吗?
因为您的子实体有一个复杂的键,因此在父实体中您也需要将外键指定为复杂的。
根据休眠配置 xml 文件中的 java class 字段更改 属性 名称。如果您的 java class 中有一个 "channel" 字段,那么它应该在您的 hbm 配置中命名为 "channel",尽管它是复合主键的一部分。
<class name="Parent" table="PARENT">
<composite-id >
<key-property name="vendor" type="string">
<column name="VENDOR" />
</key-property>
<key-property name="channel" type="string">
<column name="CHANNEL" />
</key-property>
<key-property name="createdate" type="Date">
<column name="CREATEDATE" />
</key-property>
<key-property name="refid" type="Long">
<column name="REFID" />
</key-property>
<composite-id />
<list name="childs" table="CHILD" lazy="true" fetch="select">
<key column="REFID" />
<index column="REFID" />
<one-to-many class="Child" />
</list>
另外,你应该在映射的另一端定义manyToOne关系。在 child class 中可以有一个 Parent 实例。(不仅仅是一个 ID)