spring - Hibernate 4 Annotation - MySQL Configuration Error: java.sql.SQLException: Cannot add foreign key constraint -
i getting configuration stacktrace error when try load spring boot application hibernate 4 - mysql configuration. can't figure out causing foreign key constraint problem. any appreciated!
**caused by: java.sql.sqlexception: cannot add foreign key constraint @ com.mysql.jdbc.sqlerror.createsqlexception(sqlerror.java:963) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3966) @ com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3902) @ com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:2526) @ com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2673) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2545) @ com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2503) @ com.mysql.jdbc.statementimpl.executeinternal(statementimpl.java:839) @ com.mysql.jdbc.statementimpl.execute(statementimpl.java:739) @ org.hibernate.tool.schema.internal.exec.generationtargettodatabase.accept(generationtargettodatabase.java:49) ...** here 3 database tables:
principal entity
@entity public class principal implements { @id @generatedvalue(strategy = generationtype.auto) private long principal_id; @column(name = "username", unique = true, nullable = false) private string name; @column(unique = true, nullable = false) private string email; @column(nullable = false) private string password; @column(nullable = false) private boolean locked; @manytomany( fetch = fetchtype.eager) @jointable(joincolumns = { @joincolumn(name = "principal_id", referencedcolumnname = "principal_id") }, inversejoincolumns = { @joincolumn(name = "role_id", referencedcolumnname = "role_id") }) private set<role> roles; public principal() { super(); locked = false; } public principal(final string nametoset, final string passwordtoset, final set<role> rolestoset) { super(); name = nametoset; password = passwordtoset; roles = rolestoset; } public principal(final userdto userdto) { super(); name = userdto.getname(); password = userdto.getpassword(); roles = userdto.getroles(); } @override public long getid() { return principal_id; } @override public void setid(final long idtoset) { principal_id = idtoset; } @override public string getname() { return name; } public void setname(final string nametoset) { name = nametoset; } public string getemail() { return email; } public void setemail(final string emailtoset) { email = emailtoset; } public string getpassword() { return password; } public void setpassword(final string passwordtoset) { password = passwordtoset; } public set<role> getroles() { return roles; } public void setroles(final set<role> rolestoset) { roles = rolestoset; } public boolean getlocked() { return locked; } public void setlocked(final boolean lockedtoset) { locked = lockedtoset; } } role entity
@entity public class role implements inameableentity, inameabledto { @id @generatedvalue(strategy = generationtype.auto) private long role_id; @column(unique = true, nullable = false) @size(min = 2, max = 30) @notnull private string name; public role() { super(); } public role(final string nametoset) { super(); name = nametoset; } // api @override public long getid() { return role_id; } @override public void setid(final long idtoset) { role_id = idtoset; } @override public string getname() { return name; } public void setname(final string nametoset) { name = nametoset; } persistence-mysql.properties
jdbc.driverclassname=com.mysql.jdbc.driver jdbc.url=jdbc:mysql://localhost:3306/qlc?&usessl=false jdbc.username=root jdbc.password=password hibernate.dialect=org.hibernate.dialect.mysql5dialect hibernate.show_sql=true hibernate.hbm2ddl.auto=update jpa.generateddl=true umpersistencejpaconfig.java
@configuration @enabletransactionmanagement @componentscan({ "org.qlc.um.persistence" }) @propertysource({ "persistence-mysql.properties" }) @enablejparepositories(basepackages = "org.qlc.um.persistence.dao") public class umpersistencejpaconfig { @autowired private environment env; public umpersistencejpaconfig() { super(); } // beans @bean public localcontainerentitymanagerfactorybean entitymanagerfactory() { final localcontainerentitymanagerfactorybean em = new localcontainerentitymanagerfactorybean(); em.setdatasource(datasource()); em.setpackagestoscan(new string[] { "org.qlc.um" }); final hibernatejpavendoradapter vendoradapter = new hibernatejpavendoradapter(); em.setjpavendoradapter(vendoradapter); em.setjpaproperties(additionalproperties()); return em; } @bean public datasource datasource() { final drivermanagerdatasource datasource = new drivermanagerdatasource(); datasource.setdriverclassname(env.getproperty("jdbc.driverclassname")); datasource.seturl(env.getproperty("jdbc.url")); datasource.setusername(env.getproperty("jdbc.username")); datasource.setpassword(env.getproperty("jdbc.password")); return datasource; } @bean public jpatransactionmanager transactionmanager() { final jpatransactionmanager transactionmanager = new jpatransactionmanager(); transactionmanager.setentitymanagerfactory(entitymanagerfactory().getobject()); return transactionmanager; } @bean public persistenceexceptiontranslationpostprocessor exceptiontranslation() { return new persistenceexceptiontranslationpostprocessor(); } // final properties additionalproperties() { final properties hibernateproperties = new properties(); hibernateproperties.setproperty("hibernate.hbm2ddl.auto", env.getproperty("hibernate.hbm2ddl.auto", "create-drop")); hibernateproperties.setproperty("hibernate.dialect", env.getproperty("hibernate.dialect")); // setproperty("hibernate.hbm2ddl.auto", hibernatehbm2ddlauto); // setproperty("hibernate.ejb.naming_strategy", org.hibernate.cfg.improvednamingstrategy.class.getname()); return hibernateproperties; } }
my guess, since have not marked @column in id of entity taking default property name of getter 'id'
try, principal
@id @generatedvalue(strategy = generationtype.auto) column(name="principal_id") private long principal_id; role
@id @generatedvalue(strategy = generationtype.auto) column(name="role_id") private long role_id; 
Comments
Post a Comment