Ich habe ein seltsames Problem. Ich habe einige Datensätze in der Datenbank:
Unternehmen
- id = 1, Name = Microsoft
- id = 2, Name = Sun
Jetzt habe ich eine andere Entität, Event, die einen Fremdschlüsselverweis auf Unternehmen hat:
@Entity
public class Event {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private Company company;
}
In meiner Webservice-Schicht erstelle ich ein Event unter Verwendung einer Unternehmens-ID, die als URL-Parameter übergeben wird:
@GET
@Path("addEvent")
public String addEvent(@QueryParam("cid") long companyId) {
Company alreadyInDB = new Company();
alreadyInDB.setId(companyId);
Event event = new Event();
event.setCompany(alreadyInDB);
eventService.addEvent(event);
}
Dies ruft dann den EventService auf. Ich habe ursprünglich die auskommentierte Codezeile verwendet. Aber als das mit dem Fehler der Fremdschlüsselverletzung scheiterte, fügte ich den Code hinzu, um sicherzustellen, dass der Unternehmensdatensatz existiert. Tatsächlich gibt der Code die richtige ID aus. Aber es scheitert immer noch an einer Verletzung des Fremdschlüsselconstraints.
@Service("eventService")
public class EventService {
@Autowired
EventDAO eventDAO;
@Autowired
CompanyDAO companyDAO;
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public void addEvent(Event event) throws Exception
{
System.out.println("Unternehmens-ID: " + event.getCompany().getId());
Company ensureRecordExists = companyDAO.findById(event.getCompany().getId());
System.out.println("ensureRecordExists: " + ensureRecordExists.getId());
event.setCompany(ensureRecordExists);
//event.setCompany(companyDAO.getReferenceById(event.getCompany().getId()));
eventDAO.persist(event);
}
}
Hier ist der relevante Teil des Stacktraces:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Kann keine oder Aktualisierung einer Zeile hinzufügen Ein Fremdschlüsselconstraint schlägt fehl (`blah`.`event`, CONSTRAINT `FKE7E9BF09F9DCA789` FOREIGN KEY (`company_id`) REFERENCES `Company` (`id`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
Irgendeine Idee, was hier passiert? Ich kann den Datensatz physisch im MySQL Workbench sehen. Ich habe keine Ahnung, warum es fehlschlägt. Ich dachte, es könnte etwas mit dem Flushen der Sitzung oder einem Transaktionsproblem zu tun haben...? Aber ich sehe den Datensatz...