2009-01-14 11 views
10

के साथ अमान्य SQL क्वेरी उत्पन्न करता है मेरे पास निम्न जेपीए इकाई वर्ग (उदाहरण केस) है। एक घर एक स्ट्रीट पर है। एक स्ट्रीट में कई सदन हैं।हाइबरनेट MySQL

@Entity 
public class House { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public Integer id; 

    public String name  

    @ManyToOne 
    public Street street; 
} 

@Entity 
public class Street { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public Integer id; 

    @OneToMany(mappedBy="street") 
    public Set<House> houses; 
} 

मैं पीढ़ी प्रकार पहचान करने के लिए सेट है, जो स्वत: माना जाता है कि एक नया पहचान प्रदान की है।

एक नई स्ट्रीट के साथ एक नया घर बनाते समय, मुझे पहले घर बनाना और स्ट्रीट बनाना होगा। ऐसा इसलिए है क्योंकि मेरे पास कैस्केड टाइप नहीं है, इसलिए इसे मैन्युअल रूप से किया जाना चाहिए [1]। हालांकि, जबकि एक नव निर्मित सड़क डालने:

insert into Street default values 

जो MySQL पसंद नहीं करता:

Street street = new Street(); 
entityManager.persist(street); 

हाइबरनेट/जेपीए निम्नलिखित SQL क्वेरी उत्पन्न करता है।

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'default values' at line 1 

कोई विचार क्यों? मैं जेपीए (संस्करण 3.2.1.ga) के हाइबरनेट के कार्यान्वयन के साथ जावा 6, माईएसQL 5.0.67 का उपयोग कर रहा हूं।

[1] कार्रवाई पृष्ठों 318-319

उत्तर

11

मानक SQL में EJB 3 निर्दिष्ट करता INSERT के लिए यह वैकल्पिक वाक्य रचना:

INSERT INTO <Table Name> DEFAULT VALUES 

यह कानूनी SQL सिंटैक्स, समर्थित है, उदाहरण के लिए, Microsoft SQL Server द्वारा, PostgreSQL , और SQLite, लेकिन ओरेकल, आईबीएम डीबी 2, या MySQL द्वारा नहीं।

MySQL अन्य वाक्य रचना है कि एक ही परिणाम प्राप्त समर्थन करता है:

INSERT INTO <Table Name>() VALUES() 

INSERT INTO <Table Name> (col1, col2, col3) VALUES (DEFAULT, DEFAULT, DEFAULT) 

हाइबरनेट में, आप ठीक ढंग से एसक्यूएल बोली configure चाहिए, और यह लक्ष्य आरडीबीएमएस ब्रांड के लिए मान्य एसक्यूएल उत्पन्न करने के लिए हाइबरनेट पर निर्भर है।

import org.hibernate.cfg.Configuration; 

Configuration cfg = new Configuration(); 
cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect"); 

तुम भी classpath के रूट निर्देशिका में hibernate.properties नाम की एक फ़ाइल रखकर गुण निर्दिष्ट कर सकते हैं।

11

यदि आपको अपने SQL कथन में कोई त्रुटि नहीं है, तो हो सकता है कि आप अपना टेबल कॉलम नाम जांचना चाहें क्योंकि इसमें एक पूर्वनिर्धारित नाम हो सकता है जो MySQL उपयोग करता है; उदाहरण के लिए 'कॉलम' जिसे तालिका कॉलम नाम के रूप में उपयोग नहीं किया जा सकता है

+0

धन्यवाद, आपने कड़ी मेहनत के अपने घंटों को बचाया। – Heisenberg

+0

मैं कॉलम नाम के रूप में 'कुंजी' और 'मान' का उपयोग कर रहा था। ओह। –

7

एक और स्थिति जब आपको यह अपवाद हो सकता है तब जब आप तालिका के लिए कॉलम के रूप में शब्द आरक्षित करते हैं। उदाहरण के लिए 'से' और 'से' MySQL के लिए उचित कॉलम नाम नहीं हैं। यह स्पष्ट रूप से हाइबरनेट में बग है, कि यह ऐसे स्तंभों की जांच नहीं करता है और इसके अलावा तालिका नहीं बनाई गई है, भले ही कोई त्रुटि न हो।

+0

यह वास्तव में एक बड़ा संकेत था। –

संबंधित मुद्दे