3 Stimmen

JPA/hibernate - Kann keine oder aktualisieren: Ein Kindreihen einfügen Fremdschlüsselverletzung: vorhanden - ABER Datensatz.

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...

3voto

kalyan Punkte 3047

Sie müssen das @ JoinColumn erwähnen

@ManyToOne
@ JoinColumn(name = "company_id")
private Company company;

Dies ist verantwortlich für das Erstellen der company_id in der Event-Tabelle.

2voto

nogridbag Punkte 3362

Ich habe das Problem eingegrenzt und hier eine weitere Frage gepostet:

JPA/Hibernate - Der Entity-Name scheint wichtig zu sein. Wenn ich ihn auf "Bob" umbenenne, funktioniert es einwandfrei

Ich habe die Lösung hier gefunden:

http://developmentality.wordpress.com/2011/05/23/hibernate-mysql-mac-foreign-key-nightmares-a-painless-solution-to-a-painful-problem/

Aufgrund der Kombination von MySQL, Hibernate und Mac OS X gibt es ein Problem, bei dem Sie eine Kleinbuchstaben-Naming-Strategie in Hibernate verwenden müssen. Hibernate verwendet standardmäßig eine Kamel-Case-Naming-Strategie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X