Note that there are some explanatory texts on larger screens.

plurals
  1. POCan't persist an entity with two foreign keys pointing to same table
    primarykey
    data
    text
    <p>I have three database-tables mapped as three entities:</p> <ul> <li>Employee</li> <li>Room</li> <li>EmployeeToRoom</li> </ul> <pre class="lang-java prettyprint-override"><code>public class Employee implements Serializable { @Id @Column(name = "\"id_emp\"") private Integer id_emp; @Column(name = "\"name\"") private String name; @Column(name = "\"surname\"") private String surname; ... } </code></pre> <pre class="lang-java prettyprint-override"><code>public class Room implements Serializable { @Id @Column(name = "\"id_room\"") private Integer id_room; @ManyToOne @JoinColumn(name = "\"id_roomtype\"") private RoomType type; @ManyToOne @JoinColumn(name = "\"id_floor\"") private Floor floor; ... } </code></pre> <pre class="lang-java prettyprint-override"><code>public class EmployeeToRoom implements Serializable { @Id @SequenceGenerator(name = "etr_seq", sequenceName = "etr_seq", allocationSize = 1, initialValue = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "etr_seq") @Column(name = "\"id\"") private Integer id; @ManyToOne @JoinColumn(name = "\"id_room\"") private Room room; @ManyToOne @JoinColumn(name = "\"id_emp\"") private Employee employee; /* Who created/updated record in DB */ @ManyToOne @JoinColumn(name = "\"who\"") private Employee who; /* When was record created/updated */ @Column(name = "\"when\"") private Timestamp when; private static final long serialVersionUID = -2059394677268317393L; ... } </code></pre> <p>So I'd like to store info which employee works in which room (and also who and when created database record).</p> <p>I created Managed Bean with listener:</p> <pre><code>@ManagedBean @ViewScoped public class EmployeeToRoomBean implements Serializable { private static final long serialVersionUID = 1L; final javax.persistence.EntityManager em = EntityManager.getEm(); private Logger log = LoggerFactory.getLogger(EmployeeToRoomBean.class); private EmployeeToRoomDaoJPA ETRdao = new EmployeeToRoomDaoJPA(); ... public void updateListener() { TimeStampMaker tsm = new TimeStampMaker(); ... /* Some issues */ ... EmployeeToRoom etrToadd = new EmployeeToRoom(); etrToadd.setRoom(getEditedRoom()); etrToadd.setEmployee(employee); etrToadd.setWho(UserLogin.getUser().getEmployee()); etrToadd.setWhen(tsm.getTimestampAsObject()); ETRdao.create(etrToadd); } } </code></pre> <p>If I try to make logger output with set values (setRoom(), setEmployee(), setWho(), setWhen()) everything is OK - not null values.</p> <p>And finally I have:</p> <pre><code>public class EmployeeToRoomDaoJPA implements EmployeeToRoomDao, Serializable { private static final long serialVersionUID = 1L; private Logger log = LoggerFactory.getLogger(EmployeeToRoomDaoJPA.class); ... @Override public void create(EmployeeToRoom entity) { EntityTransaction tx = em.getTransaction(); try { tx.begin(); this.log.info("Creating new EmployeeToRoom entity:"); this.log.info("Room: " + entity.getRoom().getId_room()); this.log.info("Employee: " + entity.getEmployee().getId_emp()); this.log.info("Who: " + entity.getWho().getId_emp()); this.log.info("When: " + entity.getWhen().toString()); em.persist(entity); tx.commit(); this.log.info("done inserting obj " + entity.getId()); } catch (PersistenceException pe) { if (tx != null) { tx.begin(); tx.rollback(); } throw pe; } } } </code></pre> <p><strong>And there's my problem</strong>. I just receive an PersistenceException with message that query violated not-null constraint of column Who in EmployeeToRoom entity.</p> <p>But... I added logger output immediatly after beginning a transaction. There's not null value in entity.getWho().getId_emp(). </p> <p>I can't solve this problem for several days. As you can see I have two foreign keys in EmployeeToRoom entity/table to Employee entity/table - property Employee and property Who. Can it be my problem? Or everything else is wrong?</p> <p>Many thanks for any advices.</p> <p>(Postgres DBMS, Apache Tomcat, Hibernate, JSF2/Mojarra)</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload