gpt4 book ai didi

java - 这是正确的(更好的)对象关系映射吗?

转载 作者:行者123 更新时间:2023-11-30 04:38:31 25 4
gpt4 key购买 nike

在我的项目中使用 Hibernate 确实让我陷入困境。我在这里描述了一些问题:Hibernate: getting too many rows我开始怀疑我的代码是否正确。我正在开发一个巨大的项目,我必须自己定义带有注释的映射类。但是当问题开始出现时,我决定重新创建与项目分开的部分数据库,并尝试在 IDE 中生成实体。

我有两个表:MyOptionMy具有主键:列 qwertypropertyProperty是来自 Option 的外键 table 。当然还有Optionproperty作为主键。

在我的解决方案中,我创建了 @Embeddable MyPK具有两个属性的类:String qwertyString property 。在我的My我当然有实体@EmbeddedId MyPK还有property (与 MyPK 中的列名称相同)但是这是 Option对象,而不是 MyPK 中的字符串.

@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;

这是由 Intellij Idea 中的 Hibernate Tools 生成的实体。没有EmbeddedId ,但是有@IdClass 。我以为@IdClass仅适用于基本类型。但我有一个对象作为我的主键的一部分。然而还有OptionEntity对象在这里。将基本类型和对象类型保留为一列是否正确?

@javax.persistence.IdClass(test.go.MyEntityPK.class)
@javax.persistence.Table(name = "MY", schema = "PUBLIC", catalog = "PUBLIC")
@Entity
public class MyEntity {
private String qwerty;

@javax.persistence.Column(name = "QWERTY")
@Id
public String getQwerty() {
return qwerty;
}

public void setQwerty(String qwerty) {
this.qwerty = qwerty;
}

private String text;

@javax.persistence.Column(name = "TEXT")
@Basic
public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

private String lang;

@javax.persistence.Column(name = "PROPERTY")
@Id
public String getProperty() {
return property;
}

public void setProperty(String property) {
this.property= property;
}

@Override
public boolean equals(Object o) {
//equals
}

@Override
public int hashCode() {
//hashCode
}

private OptionEntity optionByProperty;

@ManyToOne
@javax.persistence.JoinColumn(name = "PROPERTY", referencedColumnName = "PROPERTY", nullable = false)
public OptionEntity getOptionByProperty() {
return optionByProperty;
}

public void setOptionByProperty(OptionEntity optionByProperty) {
this.optionByProperty = optionByProperty;
}
}

这是MyEntityPK生成的类:

public class MyEntityPK implements Serializable {
private String qwerty;

@Id
@Column(name = "qwerty")
public String getQwerty() {
return qwerty;
}

public void setQwerty(String qwerty) {
this.qwerty = qwerty;
}

private String property;

@Id
@Column(name = "PROPERTY")
public String getProperty() {
return property;
}

public void setProperty(String property) {
this.property = property;
}

@Override
public boolean equals(Object o) {
//equals
}

@Override
public int hashCode() {
//hashCode
}
}

OptionEntity以下。这个实体中没有任何特殊点。我只想要@Version version 上的注释属性(property)以及List<MyEntity>而不是Collection<MyEntity> .

@javax.persistence.Table(name = "OPTION", schema = "PUBLIC", catalog = "PUBLIC")
@Entity
public class OptionEntity {
private Long version;

@javax.persistence.Column(name = "VERSION")
@Basic
public Long getVersion() {
return version;
}

public void setVersion(Long version) {
this.version = version;
}

private String property;

@javax.persistence.Column(name = "PROPERTY")
@Id
public String getProperty() {
return property;
}

public void setProperty(String property) {
this.property = property;
}

@Override
public boolean equals(Object o) {
//equals
}

@Override
public int hashCode() {
//hashcode
}

private Collection<MyEntity> myByProperty;

@OneToMany(mappedBy = "optionByProperty")
public Collection<MyEntity> getMyByProperty() {
return myByProperty;
}

public void setMyByProperty(Collection<MyEntity> myByProperty) {
this.myByProperty = myByProperty;
}
}

什么选项是最合适且问题较少的?我所描述的还是粘贴的?

最佳答案

摆脱属性private String lang;/private String property;它已经由manytoone定义了。您也不需要 MyEntity 主键的类。 MyEntity 可以是它自己的 id 类,具有两个属性 qwertyoption 作为其键属性 key-manytoone。

关于java - 这是正确的(更好的)对象关系映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com