JPA EntityManager und persist() (Java EE 6)

  • Themenstarter Themenstarter Infohm
  • Beginndatum Beginndatum
I

Infohm

Gast
Hallo liebe Java-Community,

Ich arbeite im Team mit ein paar Kommilitonen an einem Projekt mit Java EE 6, Glassfish 3 und MySql 5.5. Meine Zuständigkeit innerhalb des Teams beschränkt sich auf die Datenbank, welche inzwischen auch größtenteils funktionsfähig ist. Allerdings bereitet mit eine Entity Kopfzerbrechen.

Java:
@Entity
@Table(name="menu")
public class MenuEntity {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "menuId", unique = true, nullable = false)
	private long id;
	
	@Column(name="day", nullable = false)
	@Temporal(TemporalType.DATE) 
	private Date day;
	
	@ManyToOne (fetch=FetchType.LAZY)
	@JoinColumn(name="sourceId", nullable = false)
	private SourceEntity source;
	
	@OneToMany
	@JoinColumn(name="menu", referencedColumnName="menuId", nullable = true)
	private List<MealEntity> meal;

        //... (Getter,Setter, equal Override)

Diese Entity lässt sich aus irgendeinem Grund nicht in die Datenbank eintragen. Ich poste mal eben noch die create Funktion aus der EAO.

Java:
	@PersistenceContext(unitName = "is")
	private EntityManager em;
	
	private final static Logger LOGGER = Logger.getLogger(MenuEAOBean.class .getName());
	
	@EJB
	private MealEAOBean mealEAO;
	
	@EJB
	private SourceEAOBean sourceEAO;

	public long createMenu(Date day, long sourceId){
		try{
			LOGGER.info("Attempting to create Menu:\nDay: "+day.toString()+"\nSource: "+sourceId);
			SourceEntity source = sourceEAO.getSourceById(sourceId);
			if(source == null){
				LOGGER.severe("Creating Menu FAILED. Couldn't find related source "+sourceId);
				return -1;
			}
			if(checkMenuExists(day, source)){
				LOGGER.severe("Creating menu FAILED. There's already a menu existing with:\nDay: "+day.toString()+" AND Source "+source.getId());
				return -1;
			}
			
			MenuEntity m = new MenuEntity();
			m.setDay(day);
			m.setSource(source);
			
			em.persist(m);
			em.flush();
			
			LOGGER.info("Menu "+m.getId()+" SUCCESSFULLY created");
			return m.getId();
		}catch(Exception e){
			LOGGER.severe(e.toString()+" function createMenu().");
			return -1;
		}
	}

Bei Aufruf der createMenu-Methode. Wird die Entity korrekt befüllt und ihr wird eine ID zugewiesen. (Beides hab ich über die Logfile des Servers getestet) ALLERDINGS landet kein Eintrag in der Datenbank, obwohl ich hier eigentlich nichts anderes mache als bei allen anderen Entities bei denen es funktioniert. Es landet auch keine Exception im Logfile.

Bereits probiert hab ich:
- Date auszukommentieren und das menu nur anhand einer source zu erstellen.
- Source aszukommentieren und das menu nur anhand eines dates zu erstellen.
- Alle nullables auf true zu stellen (natürlich sowohl in der Entity als auch in der DB)

Wenn jemand eine Idee hat was ich falsch mache (gerne auch abgesehen von meinem "Persist-Problem") würd ich mich tierisch freuen 🙂

LG
Infohm
 
Irgendwie fehlt mir bei Deiner createMenu-Methode der Transaktionskontext, speziell der Commit. Ich kenne mich mit EJB nicht so aus. Kann sein, dass das vom Container implizit gemacht wird, aber falls nicht, müsste in den Code noch irgendwie ein commit() rein.
 
Irgendwie fehlt mir bei Deiner createMenu-Methode der Transaktionskontext, speziell der Commit. Ich kenne mich mit EJB nicht so aus. Kann sein, dass das vom Container implizit gemacht wird, aber falls nicht, müsste in den Code noch irgendwie ein commit() rein.

Das Transaktionshandling macht der Container bei EJBs implizit, sofern es nicht anders konfiguriert wurde.
 
Erstmal danke für eure Antworten. 🙂

Irgendwie fehlt mir bei Deiner createMenu-Methode der Transaktionskontext, speziell der Commit. Ich kenne mich mit EJB nicht so aus. Kann sein, dass das vom Container implizit gemacht wird, aber falls nicht, müsste in den Code noch irgendwie ein commit() rein.

Also in anderen EAOs unseres Servers funktioniert es analog einwandfrei.

ich kann auch noch mehr Informationen posten wie DB-Aufbau, Relationsmodell, usw. wenn das irgendwie hilft, ich wollte nur den OP nicht noch unübersichtlicher machen.
 
Hi Infohm,

ich bin mir nicht ganz sicher (ist schon ne Weile her), aber ich kenn die OneToMany Annotation so:

Java:
@OneToMany(mappedBy="menuId")
private List<MealEntity> meal;

Vielleicht kann hier die Verknüpfung nicht hergestellt werden.
lg
 

Neue Themen


Zurück
Oben