Java 冬眠:';实体'中的重复列映射;vs';不允许在属性中混合使用可更新列和不可更新列';
我有遗产数据库Java 冬眠:';实体'中的重复列映射;vs';不允许在属性中混合使用可更新列和不可更新列';,java,hibernate,jpa,orm,mapping,Java,Hibernate,Jpa,Orm,Mapping,我有遗产数据库 +----+ +------------+ +------------+ |Site| |Content | |Program | +----+ +------------+ +------------+ |id | |id:PK | |siteId:PK,FK| |name| |siteId:FK | |code:PK | +----+ |prog_code:FK| |name | |prog_
+----+ +------------+ +------------+
|Site| |Content | |Program |
+----+ +------------+ +------------+
|id | |id:PK | |siteId:PK,FK|
|name| |siteId:FK | |code:PK |
+----+ |prog_code:FK| |name |
|prog_param | +------------+
+------------+
表内容有一个PK列。siteId列不是PK的一部分。
表程序有两个PK列(siteId,code)。它是复合PK。这个表可以作为模板使用。程序中唯一的变量是parameter,它位于表内容的prog_param列上
我想把这个表映射到这样的对象
+-----------+ +------------+ +-----------+ +---------------+
|Site | |Program | |ProgramId | |Content |
+-----------+ +------------+ +-----------+ +---------------+
|id:long | |id:ProgramId| |site:Site | |id:long |
|name:String| |name:String | |code:String| |site:Site |
+-----------+ |param:String| +-----------+ |program:Program|
+------------+ +---------------+
但我不知道如何在这种复杂的情况下映射“内容”和“程序”
所以,我试图使情况变得简单。
我已将prog_param映射到内容
+-----------+ +------------+ +-----------+ +-------------------+
|Site | |Program | |ProgramId | |Content |
+-----------+ +------------+ +-----------+ +-------------------+
|id:long | |id:ProgramId| |site:Site | |id:long |
|name:String| |name:String | |code:String| |site:Site |
+-----------+ +------------+ +-----------+ |program:Program |
|programParam:String|
+-------------------+
作为代码
@Entity
@Table(name = "SITE")
@Getter @Setter
public class Site {
@Id
@Column(name = "SITE")
protected String id;
@Column(name = "NAME")
protected String name;
}
@Entity
@Table(name = "PROGRAM")
@Getter @Setter
public class Program {
@EmbeddedId
protected ProgramId id;
@Column(name = "NAME")
protected String name;
}
@Embeddable
@Getter @Setter @EqualsAndHashCode
public class ProgramId implements Serializable{
@ManyToOne
@JoinColumn(name = "SITE")
protected Site site;
@Column(name = "code")
protected String code;
}
@Entity
@Table(name="CONTENT")
@Getter
@Setter
public class Content {
@Id
@Column(name = "ID")
protected Long id;
@ManyToOne
@JoinColumn(name = "SITEID",referencedColumnName="SITE")
protected Site site;
@OneToOne
@JoinColumns({
@JoinColumn(name="SITEID",referencedColumnName="SITE"),
@JoinColumn(name="PROG_CODE",referencedColumnName="CODE"),
})
protected Program program;
}
但这不是工作。Hibernate引发“实体映射中的重复列”异常
所以我研究了一些解决方案。
最后,我发现当Hibernate无法确定使用哪个属性时,会抛出这个“实体映射中的重复列”异常
Stackoverflows的解决方案将“insertable=false,Updateable=false”设置为@JoinColumn,因此让hibernate确定使用哪个属性
我想使用内容的属性“site”,因为它使用非常频繁。在我的应用程序中,Site和Program属性分别使用
所以我尝试将“insertable=false,updateable=false”设置为内容的属性“program”
@OneToOne
@JoinColumns({
@JoinColumn(name="SITEID",referencedColumnName="SITE", insertable=false, updatable=false),
@JoinColumn(name="PROG_CODE",referencedColumnName="CODE"),
})
protected Program program;
这也不是工作。”“不允许在属性中混合可更新列和不可更新列”引发异常
因此,我将“insertable=false,Updateable=false”设置为“PROG_CODE”,当然,当我设置不同的PROG_代码时,Hibernate不会更改PROG_代码
在这一点上,我不知道
请让我知道一些解决这种情况的办法 我遇到了同样的问题,两个共享一个属性的组合键失败,出现“实体映射中的重复列”。我认为这可能是一个错误,参考:。我正在使用Hibernate 3.6.4