如何解决休眠状态不保存组合键对象
我遇到与对象持久化到数据库有关的问题。 我正在使用这些技术:
- JavaEE
- 行家
- Postgres 11.9
- 休眠5.3.14.Final-redhat-00001
- JBoss EAP 7.3
我需要对事务进行容器管理,所以这是我的配置:
- 我已经在我的JBoss standalone.xml配置中声明了一个数据源:
...
<subsystem xmlns="urn:jboss:domain:datasources:5.0">
<datasources>
...
<datasource jndi-name="java:jboss/datasources/PostgresDS" pool-name="PostgresPool" enabled="true">
<connection-url>jdbc:postgresql://localhost:5432/my-db</connection-url>
<driver>postgres</driver>
<security>
<user-name>postgres</user-name>
<password>root</password>
</security>
</datasource>
<drivers>
...
<driver name="postgres" module="org.postgres">
<driver-class>org.postgresql.Driver</driver-class>
</driver>
</drivers>
</datasources>
</subsystem>
- 我创建了一个HibernateUtil类,它引用了数据源:
private static SessionFactory sessionFactory;
private static Configuration configuration;
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
sessionFactory = buildSessionFactory();
}
return sessionFactory;
}
private static SessionFactory buildSessionFactory() {
Properties properties = new Properties();
properties.setProperty("hibernate.connection.datasource","java:jboss/datasources/PostgresDS");
properties.setProperty("hibernate.show_sql","true");
configuration = new Configuration();
configuration.setProperties(properties);
addClasses(configuration);
SessionFactory sessionFactory = configuration.buildSessionFactory();
return sessionFactory;
}
但现在有问题了...
我有以下实体:
- 书
@Entity
@Table(name = "book",schema = "public")
public class BookDAO implements java.io.Serializable {
private int idBook;
private String name;
private Set<BookHasAuthorDAO> bookHasAuthors = new HashSet<BookHasAuthorDAO>(0);
public BookDAO() {
}
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "idbook",unique = true,nullable = false)
public int getIdBook() {
return idBook;
}
public void setIdBook(int idBook) {
this.idBook = idBook;
}
@Column(name = "name",nullable = false,length = 150)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OnetoMany(fetch = FetchType.LAZY,mappedBy = "book")
public Set<BookHasAuthorDAO> getBookHasAuthors() {
return bookHasAuthors;
}
public void setBookHasAuthors(Set<BookHasAuthorDAO> bookHasAuthors) {
this.bookHasAuthors = bookHasAuthors;
}
}
- 作者
@Entity
@Table(name = "author",schema = "public")
public class AuthorDAO implements java.io.Serializable {
private int idAuthor;
private String name;
private Set<BookHasAuthorDAO> bookHasAuthors = new HashSet<BookHasAuthorDAO>(0);
public AuthorDAO() {
}
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "idAuthor",nullable = false)
public int getIdAuthor() {
return idAuthor;
}
public void setIdAuthor(int idAuthor) {
this.idAuthor = idAuthor;
}
@Column(name = "name",mappedBy = "author")
public Set<BookHasAuthorDAO> getBookHasAuthors() {
return bookHasAuthors;
}
public void setBookHasAuthors(Set<BookHasAuthorDAO> bookHasAuthors) {
this.bookHasAuthors = bookHasAuthors;
}
}
- BookHasAuthor
@Entity
@Table(name = "book_has_athor",schema = "public")
public class BookHasAuthorDAO implements java.io.Serializable {
private BookHasAuthorIdDAO id;
private BookDAO book;
private AuthorDAO author;
private int percentage;
public BookHasAuthorDAO() {
}
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "idBook",column = @Column(name = "book_idbook",nullable = false)),@AttributeOverride(name = "idAuthor",column = @Column(name = "author_idauthor",nullable = false)) })
public BookHasAuthorIdDAO getId() {
return id;
}
public void setId(BookHasAuthorIdDAO id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_idbook",insertable = false,updatable = false)
public BookDAO getBook() {
return book;
}
public void setBook(BookDAO book) {
this.book = book;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "author_idauthor",updatable = false)
public AuthorDAO getAuthor() {
return author;
}
public void setAuthor(AuthorDAO author) {
this.author = author;
}
@Column(name = "percentage",nullable = false)
public int getPercentage() {
return percentage;
}
public void setPercentage(int percentage) {
this.percentage = percentage;
}
}
- BookHasAuthorId
@Embeddable
public class BookHasAuthorIdDAO implements java.io.Serializable {
private int idBook;
private int idAuthor;
public BookHasAuthorIdDAO() {
}
@Column(name = "book_idbook",nullable = false)
public int getIdBook() {
return idBook;
}
public void setIdBook(int idBook) {
this.idBook = idBook;
}
@Column(name = "author_idauthor",nullable = false)
public int getIdAuthor() {
return idAuthor;
}
public void setIdAuthor(int idAuthor) {
this.idAuthor = idAuthor;
}
//equals and hashCode implementations
}
我正在尝试以这种方式保存这些对象:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
BookDAO book = new BookDAO();
book.setName("The Picture of Dorian Gray")
session.save(book);
AuthorDAO author = new AuthorDAO();
author.setName("Oscar Wilde");
session.save(author);
BookHasAuthorIdDAO id = new BookHasAuthorIdDAO();
id.setIdBook(book.getId());
id.setIdAuthor(author.getId());
BookHasAuthorDAO bookHasAuthor = new BookHasAuthorDAO();
bookHasAuthor.setId(id);
bookHasAuthor.setBook(book);
bookHasAuthor.setAuthor(author);
bookHasAuthor.setPercentage(100);
session.save(bookHasAuthor);
将书成功保存到数据库中,并且也将作者保存到BookHasAuthor中。不会引发任何异常,并且休眠调试日志记录信息不会显示有关插入的任何内容。
但是,等等,还不止这些! 我尝试了以下方案:
- 我用@TransactionManagement(TransactionManagementType.BEAN)注释了我的类,以便自行处理事务,然后更改了业务实现:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
BookDAO book = new BookDAO();
book.setName("The Picture of Dorian Gray")
session.save(book);
AuthorDAO author = new AuthorDAO();
author.setName("Oscar Wilde");
session.save(author);
BookHasAuthorIdDAO id = new BookHasAuthorIdDAO();
id.setIdBook(book.getId());
id.setIdAuthor(author.getId());
BookHasAuthorDAO bookHasAuthor = new BookHasAuthorDAO();
bookHasAuthor.setId(id);
bookHasAuthor.setBook(book);
bookHasAuthor.setAuthor(author);
bookHasAuthor.setPercentage(100);
session.save(bookHasAuthor);
tr.commit();
session.close();
这有效!但是我需要由容器来管理事务,因此这不是我的解决方案。
- 上次保存后,我试图保存另一个对象:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
BookDAO book = new BookDAO();
book.setName("The Picture of Dorian Gray")
session.save(book);
AuthorDAO author = new AuthorDAO();
author.setName("Oscar Wilde");
session.save(author);
BookHasAuthorIdDAO id = new BookHasAuthorIdDAO();
id.setIdBook(book.getId());
id.setIdAuthor(author.getId());
BookHasAuthorDAO bookHasAuthor = new BookHasAuthorDAO();
bookHasAuthor.setId(id);
bookHasAuthor.setBook(book);
bookHasAuthor.setAuthor(author);
bookHasAuthor.setPercentage(100);
session.save(bookHasAuthor);
Foo foo = new Foo();
foo.setProperty("property");
session.save(foo);
这可行,同时保存BookHasAuthorDAO和Foo。
您有什么解决方案吗?这真让我抓狂。 谢谢你们
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。