启动时,我无法使用spring boot自动加载我的数据库架构。
这是我的application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=test
spring.datasource.password=
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
这是我的Application.java:
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(final String[] args){
SpringApplication.run(Application.class, args);
}
}
以下是一个示例实体:
@Entity
@Table(name = "survey")
public class Survey implements Serializable {
private Long _id;
private String _name;
private List<Question> _questions;
/**
* @return survey's id.
*/
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "survey_id", unique = true, nullable = false)
public Long getId() {
return _id;
}
/**
* @return the survey name.
*/
@Column(name = "name")
public String getName() {
return _name;
}
/**
* @return a list of survey questions.
*/
@OneToMany(mappedBy = "survey")
@OrderBy("id")
public List<Question> getQuestions() {
return _questions;
}
/**
* @param id the id to set to.
*/
public void setId(Long id) {
_id = id;
}
/**
* @param name the name for the question.
*/
public void setName(final String name) {
_name = name;
}
/**
* @param questions list of questions to set.
*/
public void setQuestions(List<Question> questions) {
_questions = questions;
}
}
任何想法我做错了什么?
答案 0 :(得分:45)
有几种可能的原因:
@EnableAutoConfiguration.
进行分类的情况如果没有,那么您的spring应用程序看不到它们因此不会在db中创建任何内容检查你的配置,似乎你正在使用一些特定于hibernate的选项,尝试用以下内容替换它们:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=test
spring.datasource.password=
您的application.properties
必须位于src/main/resources
文件夹中。
如果你没有正确指定dialect,它可能会尝试默认与boot in-memory数据库捆绑在一起(和我一样)我可以看到它尝试连接到本地HSQL
(参见console输出)实例并且在更新模式时失败。
答案 1 :(得分:40)
您是否尝试过运行它:
spring.jpa.generate-ddl=true
然后
spring.jpa.hibernate.ddl-auto = create
默认情况下,DDL执行(或验证)将延迟到ApplicationContext启动。还有一个spring.jpa.generate-ddl标志,但如果Hibernate autoconfig处于活动状态,则不会使用它,因为ddl-auto设置更精细。
答案 2 :(得分:13)
@SpringBootApplication
@EnableConfigurationProperties
@EntityScan(basePackages = {"com.project.ppaa.model"}) // scan JPA entities
public class Application {
private static ConfigurableApplicationContext applicationContext;
public static void main(String[] args) {
Application.applicationContext = SpringApplication.run(Application.class, args);
}
}
它应该自动工作,但如果没有,你可以输入基础包
@EntityScan(basePackages = {"com.project.ppaa.model"}) // scan JPA entities manually
答案 3 :(得分:6)
如果您的实体类与主类不在同一个包中,则可以在主类中使用@EntityScan
注释,指定要保存或打包的实体。就像你的模型包一样。
关于:
spring.jpa.hibernate.ddl-auto = create
您可以使用update
选项。它不会删除任何数据,并会以相同的方式创建表。
答案 4 :(得分:6)
使用以下两个设置确实有效。
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
答案 5 :(得分:2)
在我的情况下,即使我使用JPArepository,也没有自动创建表。 在我的springboot app application.properties文件中添加以下属性后,现在将自动创建表。 的 spring.jpa.hibernate.ddl-自动=更新强>
答案 6 :(得分:2)
对我来说,以上给出的答案均无济于事,因为后来我发现问题出在我的pom
文件中。我使用了spring boot starter项目,并添加了另一种不起作用的spring jpa。
最初我有这个,
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
我将其替换为:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
记下 spring-boot-starter-data-jpa 。希望这可以对某人有所帮助。检查您的pom文件,并确保您的依赖项匹配。
答案 7 :(得分:2)
我也有同样的问题。原来我在主Application类上设置了@PropertySource注释来读取不同的基本属性文件,因此不再使用普通的“application.properties”。
答案 8 :(得分:1)
您需要根据您的Spring Boot版本及其下载的库版本提供配置。
仅在您的Spring Boot设置已下载Hibernate v4时使用以下内容。
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
Hibernate 5不支持上述功能。
如果您的Spring Boot Setup已经下载了Hibernate v5.x,那么请选择以下定义:
spring.jpa.hibernate.naming.physical策略= org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
重要:
在Spring Boot应用程序开发中,您应该更喜欢使用注释:@SpringBootApplication
,它已经过以下注释:@SpringBootConfiguration and @EnableAutoConfiguration
现在 如果您的实体类与Main Class所在的包不同,则Spring Boot不会扫描这些包。
因此,您需要明确定义注释:@EntityScan(basePackages = { "com.springboot.entities" })
此注释扫描基于JPA的带注释的实体类(以及其他类似MongoDB,Cassandra等)
注意:强>
“com.springboot.entities”是自定义包名。
以下是我在application.properties中定义基于Hibernate和JPA的属性来创建表的方法: -
spring.datasource.driver类名= com.mysql.jdbc.Driver
spring.datasource.url =的jdbc:mysql的://本地主机:3333 /开发useSSL =真的吗? spring.datasource.username =管理员
spring.datasource.password =
spring.jpa.open式视=假
spring.jpa.hibernate.ddl-AUTO =创建
spring.jpa.generate-ddl = true
spring.jpa.hibernate.use新-ID-发电机映射=真
spring.jpa.hibernate.naming.physical策略= org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.show-SQL =真
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.format_sql =真
我可以使用上面提到的配置创建表格。
请参阅并在适用的地方更改您的代码。
答案 9 :(得分:1)
我遇到了类似的问题。我使用的是Spring Boot 2.x,却错过了在Spring Initializer中添加Postgres依赖项的过程。 我手动添加了依赖项
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
这就是我得到的- 信息org.hibernate.dialect.Dialect-HHH000400:使用方言: org.hibernate.dialect.PostgreSQLDialect 代替
**INFO org.hibernate.dialect.Dialect - HHH000400: Using
dialect:org.hibernate.dialect.PostgreSQL10Dialect**
这将我连接到数据库
并不是很奇怪,因为Springboot本身会进行版本依赖并减少开发工作。另一方面,如果Springboot选择了不正确的依赖关系,则会浪费很多时间。
答案 10 :(得分:1)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
MySQL5Dialect是骗人的,以前我使用的是'MySQLDialect'
答案 11 :(得分:1)
这是我在阅读完以上所有答案后所做的。
#! /bin/bash
Var = `anil`
If [ -n "$Var" ] ; then
echo " nn"
else
echo "emp"
fi
和其他简单属性添加到 application.properties 答案 12 :(得分:0)
在我的情况下,我不得不用名称 user
重命名表。例如,我将它重命名为 users
并且它起作用了。
答案 13 :(得分:0)
使用springboot连接到mysql并自动在数据库中创建表:
spring.datasource.url=jdbc:mysql://localhost:3306/solace spring.datasource.username=root spring.datasource.password=root spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=update
答案 14 :(得分:0)
这个对我有帮助
我假设你有 INNODB 引擎:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
答案 15 :(得分:0)
如果您在Spring Boot上遇到此问题,请仔细检查您的软件包名称,该名称应与以下内容完全相同:
com.example.YOURPROJECTNAME - consists main application class
com.example.YOURPROJECTNAME.entity - consists entities
答案 16 :(得分:0)
我有同样的问题,但我补充
spring.jpa.hibernate.ddl-auto = create
现在一切正常
答案 17 :(得分:0)
以下配置对我有用:
spring.jpa.properties.javax.persistence.schema-generation.database.action=create
spring.jpa.properties.javax.persistence.schema-generation.create-database-schemas=true
spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.drop-source=metadata
spring.jpa.properties.javax.persistence.schema-generation.connection=jdbc:mysql://localhost:3306/your_database
答案 18 :(得分:0)
我用这种解决方案解决了我的案件。 只是在 application.properties 文件的 spring.datasource.url 属性上插入一个新参数 createDatabaseIfNotExist = true ,如下所示:>
public class DataContainer : INotifyPropertyChanged
{
private int number1 = 0;
private string text1 = "none";
private System.Timers.Timer aTimer;
public event PropertyChangedEventHandler PropertyChanged;
public DataContainer(int num,string str)
{
number1 = num;
text1 = str;
aTimer = new System.Timers.Timer(num*1000);
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
Random r = new Random();
number1 = r.Next(0, 100);
number1 += 1;
this.NotifyPropertyChanged("Number1");
}
public int Number1
{
get { return this.number1; }
set
{
if (this.number1 != value)
{
this.number1 = value;
this.NotifyPropertyChanged("Number1");
}
}
}
public string Text1
{
get { return this.text1; }
set
{
if (this.text1 != value)
{
this.text1 = value;
this.NotifyPropertyChanged("Text1");
}
}
}
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
我具有带有DDL的 src / main / resources / Schema.sql 来创建数据库模式。我确实使用了 flyaway 来创建和维护表。
我在这里建立了这个解决方案: original answer
答案 19 :(得分:0)
只需在spring数据源网址中添加 createDatabaseIfNotExist = true 参数
示例: spring.datasource.url = jdbc:mysql:// localhost:3306 / test?createDatabaseIfNotExist = true
答案 20 :(得分:0)
Abderrahmane的响应是正确的:在url属性中添加?createDatabaseIfNotExist=true
。
看来ddl-auto
不会做任何事情。
答案 21 :(得分:0)
如果您的数据库是MySQL:
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root
如果您的数据库是PostgreSQL:
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:postgresql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root
答案 22 :(得分:0)
您只需像这样添加with tf.device("your_device_name")
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using FSG.MeshAnimator;
public class ZombieAI : MonoBehaviour
{
/// <summary>
/// Components
/// </summary>
MeshAnimator mesh;
AudioSource audioSrc;
SphereCollider sphereCollider;
CapsuleCollider capsuleCollider;
NavMeshAgent agent;
/// <summary>
/// Child Objects
/// </summary>
GameObject EnemyIcon;
/// <summary>
/// Animations
/// </summary>
public MeshAnimation[] deathAnimations = new MeshAnimation[5];
string curDeathAnimations;
public MeshAnimation[] runAnimations = new MeshAnimation[1];
/// <summary>
/// Sounds
/// </summary>
public AudioSource _as;
public AudioClip[] infectedNoises;
public int randomNoiseNum;
/// <summary>
/// Textures
/// </summary>
public Texture[] mantexture = new Texture[16];
public Texture[] womantexture = new Texture[17];
/// <summary>
/// Health
/// </summary>
public float max_health = 5f;
public float cur_health = 5f;
public float distance;
/// <summary>
/// Awareness
/// </summary>
public bool female;
public bool alive;
public bool spotted = false;
public bool attack = false;
bool create = false;
/// <summary>
/// Targets
/// </summary>
public GameObject target;
/// <summary>
/// Veriables
/// </summary>
public float velocity;
private Vector3 previous;
[Range(0f, 1.35f)]
public float attackRange;
[Range(3f, 5f)]
public float runAttackRange;
[Range(1f, 100f)]
public float detectionRange;
[Range(1f, 10f)]
public float runSpeed = 3.5f;
float onMeshThreshold = 3;
private void Start()
{
if (female == false)
{
gameObject.GetComponent<Renderer>().material.SetTexture("_MainTex", mantexture[Random.Range(0, mantexture.Length)]);
}
if (female == true)
{
GetComponent<Renderer>().material.SetTexture("_MainTex", womantexture[Random.Range(0, womantexture.Length)]);
}
curDeathAnimations = deathAnimations[Random.Range(0, deathAnimations.Length)].name;
//EnemyIcon = transform.Find("Enemy-Icon").gameObject;
mesh = GetComponent<MeshAnimator>();
audioSrc = GetComponent<AudioSource>();
_as = GetComponent<AudioSource>();
sphereCollider = GetComponent<SphereCollider>();
capsuleCollider = GetComponent<CapsuleCollider>();
agent = GetComponent<NavMeshAgent>();
target = GameObject.FindGameObjectWithTag("Player");
alive = true;
if (transform.position.y <= 0 && transform.position.y >= 1)
{
Destroy(gameObject);
}
}
public void Update()
{
if (alive)
{
distance = Vector3.Distance(target.transform.position, transform.position);
velocity = ((transform.position - previous).magnitude) / Time.deltaTime;
previous = transform.position;
if (transform.position.y <= 1 && transform.position.y >= -1)
{
create = true;
if (create == false)
{
Destroy(gameObject);
}
else if (create == true)
{
agent.SetDestination(target.transform.position);
}
}
if (velocity > 0 && !attack)
{
mesh.speed = velocity / 3;
mesh.Play("Run1-0");
}
if (velocity > 0 && attack && spotted)
{
spotted = true;
mesh.Play("Run Attack");
}
else if (velocity == 0 && attack && spotted)
{
mesh.Play("Attack1-0");
}
if (distance < detectionRange)
{
spotted = true;
}
if (spotted && distance < attackRange)
{
Vector3 targetPosition = new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z);
transform.LookAt(targetPosition);
}
randomNoiseNum = Random.Range(0, 400);
if (alive && randomNoiseNum == 20)
{
PlayRandomNoise();
}
}
/* if (alive && distance > attackRange && velocity <= 0.05f && !attack)
{
mesh.Play("Idle1-0");
}*/
if (!alive)
{
//mesh.Play(curDeathAnimations);
//ScoreManager.scoreValue += 1;
Destroy(gameObject, 5);
}
if (cur_health <= 0)
{
mesh.speed = 1;
alive = !alive;
mesh.Play(curDeathAnimations);
//Destroy(mesh,0);
Destroy(EnemyIcon);
Destroy(audioSrc, 0);
Destroy(sphereCollider, 0);
Destroy(capsuleCollider, 0);
Destroy(agent, 0);
alive = false;
}
}
void OnTriggerStay(Collider col)
{
attack = true;
}
void OnTriggerExit(Collider col)
{
attack = false;
}
public void PlayRandomNoise()
{
if (female == true)
{
_as.volume = 2.0f;
_as.clip = infectedNoises[Random.Range(0, infectedNoises.Length)];
_as.pitch = Random.Range(1.10f, 1.35f);
_as.PlayOneShot(_as.clip);
}
else
{
_as.volume = 2.0f;
_as.pitch = Random.Range(0.75f, 1.05f);
_as.clip = infectedNoises[Random.Range(0, infectedNoises.Length)];
_as.PlayOneShot(_as.clip);
}
}
}
到您的application.properties文件
答案 23 :(得分:0)
很简单,我们在spring.jpa.hibernate.ddl-auto = create;
后添加分号
这是错误的spring.jpa.hibernate.ddl-auto = create
足够的
答案 24 :(得分:0)
之前我遇到过同样的问题。我的问题是我试图通过使用&#34; List&#34;来建立的实体关系。我知道这是原因,因为没有list变量,程序运行正常。在你的情况下,我认为问题是:
private List<Question> _questions;
我假设您已经有一个名为Question的课程。所以,试着:
@OneToMany
private Question _questions;
但事实是,在你的方法中,你将处理它,所以它返回一个列表。我将Spring Data JPA与CrudRepository一起使用。所以,如果你决定使用它,你的可能会是这样的:
public List<Question> findById( Long _id );
您需要做更多更改,但这些更改非常简单明了。请参阅this Java Brains video以更好地掌握并了解还需要修改的内容。
答案 25 :(得分:0)
Use this Sample code
application.properties
# DataSource settings: set here your own configurations for the database
# connection. In this example we have "dojsb" as database name and
# "root" as username and password.
spring.datasource.url =jdbc:postgresql://localhost:5432/usman
spring.datasource.username = postgres
spring.datasource.password = 12345
# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = create
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
server.port = 8963
Entity Class:
import java.sql.Timestamp;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Type;
@Entity
@Table(name = "QUEUERECORDS")
public class QueuesRecords {
@Id
private UUID id;
@Column(name="payload", nullable = true)
@Type(type="text")
private String payload;
@Column(name="status", nullable = true)
@Type(type="text")
private String status;
private Timestamp starttime;
private Timestamp endtime;
@Column(name="queueid",nullable= true)
@Type(type="text")
private String queueid;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getPayload() {
return payload;
}
public void setPayload(String payload) {
this.payload = payload;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Timestamp getStarttime() {
return starttime;
}
public void setStarttime(Timestamp starttime) {
this.starttime = starttime;
}
public Timestamp getEndtime() {
return endtime;
}
public void setEndtime(Timestamp endtime) {
this.endtime = endtime;
}
public String getQueueid() {
return queueid;
}
public void setQueueid(String queueid) {
this.queueid = queueid;
}
}
Main class
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Test{
public static void main(String[] args) {
SpringApplication.run(Test.class, args);
}
}
答案 26 :(得分:-1)
我遇到了同样的问题,只用这个添加解决了它:
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
答案 27 :(得分:-3)
添加
spring.jpa.databaseplatform=org.hibernate.dialect.PostgreSQLDialect
最后。这将解决您的问题。 只有这个缺失