【问题标题】:Save object with Hibernate annotations?使用 Hibernate 注释保存对象?
【发布时间】:2011-05-24 23:56:06
【问题描述】:

我只是想知道在使用 Hibernate 注释创建数据库后如何创建对象?

当我运行下面的代码时,它会使用对象创建数据库,但是当我第二次运行时它只是创建完全相同的,并且没有添加任何新对象?怎么会?在使用注释创建数据库后,如何使用 .save 方法使用注释创建对象?还是不能用注解来做到这一点?

提前致谢。

public static void main(String[] args) {

    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null;
    try {
        transaction = session.beginTransaction();

        Adress adress = new Adress("Streetname", "postcode");

        Person person1 = new Person("Peter Hanks", adress);
        Person person2 = new Person("Sophie Hanks", adress);

        session.save(person1);
        session.save(person2);
        transaction.commit();



    } catch (HibernateException e) {
        transaction.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }

}

这里是person.class的代码

@Entity
@Table(name="person")
public class Person implements Serializable {
private long id;
private String navn;
private Adresse adresse;

public Person() {
}

public Person(String navn, Adresse adresse) {
    this.navn = navn;
    this.adresse = adresse;
}

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name= "adresse_id", nullable = false)
public Adresse getAdresse() {
    return adresse;
}

public void setAdresse(Adresse adresse) {
    this.adresse = adresse;
}

@Id
@GeneratedValue
@Column(name= "id")
public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

@Column(name = "navn", nullable= false, length= 100)
public String getNavn() {
    return navn;
}

public void setNavn(String navn) {
    this.navn = navn;
}


@Override
public int hashCode() {
    int hash = 3;
    hash = 29 * hash + (this.navn != null ? this.navn.hashCode() : 0);
    hash = 29 * hash + (this.adresse != null ? this.adresse.hashCode() : 0);
    return hash;
}





@Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Person other = (Person) obj;
        if ((this.navn == null) ? (other.navn != null) : !this.navn.equals(other.navn)) {
            return false;
        }
        if (this.adresse != other.adresse && (this.adresse == null || !this.adresse.equals(other.adresse))) {
            return false;
        }
        return true;
    }

【问题讨论】:

    标签: java hibernate orm hibernate-mapping object-persistence


    【解决方案1】:

    您可能需要向我们展示您是如何编写和注释 PersonAdress(原文如此)对象的。

    如果您编写了“正确的”equals()hashcode() 实现(即不查看对象的 @Id),那么您的 save() 调用第二次将不会执行任何操作,因为您要求保存的对象已存在于数据库中。

    【讨论】:

    • 我不明白。我正在使用@GeneratedValue,所以它不应该是一个问题。数据库正在统计id,所以不能是同一个对象??
    • 在第一次和第二次运行之间,将“Peter”更改为“Paul”,将“Sophie”更改为“Sarah”。你现在得到更多对象了吗?
    • 不,第二次运行第一个对象仍然存在于数据库中.. 第二次添加没有记录???我刚刚添加了 person.class 的代码
    • 奇数。代码看起来不错,你是如何让 Hibernate 构建你的模式的?在您的问题中,您说“它使用对象创建数据库”-您使用的是哪种 hbm2ddl 模式?
    • ok.. 我正在使用 create.. create
    【解决方案2】:

    刚刚把hibernate.hbm2ddl.auto的设置从create改成了create-update,现在没有问题了……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多