Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 42

0
votes
answers
32 views
+10

基於彈簧配置文件的彈簧引導應用程序屬性

-1

嗨,我希望我的彈簧引導web項目可以在開發和生產環境中部署,並且應該在特定的基於配置文件的設置上運行。基於彈簧配置文件的彈簧引導應用程序屬性

我一直在關注如何做到這一點,首先我搜索的是在src/main/resources classpath中正確定義application- {profile name} .properties。

現在的問題是如何設置配置文件。

因爲我在linux上的tomcat 8上工作,應該有一些配置,但我不知道該怎麼做。

我也很好奇,當我的項目打包成war文件時,java -jar {filename} -Dspring.active.profile = blahblah不會工作,但我認爲有一種替代方法。

加,有沒有辦法在Windows 10中的tomcat 8上設置配置文件?

感謝您

0
votes
answers
19 views
+10

在服務器上使用angular 2部署的彈簧mvc

0

我想爲web瀏覽器,android和ios創建一個Spring MVC rest應用程序。對於web瀏覽器,我使用的是angular2,而我的web服務器是apache tomcat。 所以我很困惑,我需要把角碼放到我的Spring mvc appllication項目目錄中,或者爲angular.創建一個單獨的實例。如果我必須爲這兩個方法創建單獨的實例,那麼我將如何將角碼部署到tomcat服務器。在服務器上使用angular 2部署的彈簧mvc

沙发
0
0

你可以做到這一點。

如果要將angular2文件放到tomcat然後look here。這可能並不簡單。

如果你想分開部署,我的意思是服務器(spring REST)和客戶端(angular2),那麼angular2應用可以使用ng命令或任何web服務器(如Apache,nginx)進行部署。你可以看看here例如

板凳
0
0

你可以用任何方式做到這一點。


但 有SPA + REST的技術堆棧,我更喜歡分離前端和 回來REST API結束,因爲靜態資源最好從前端服務器提供服務。由於前端服務器(例如nginx,apache2)功能非常強大,並且由於您可以將緩存用於靜態資源,因此可以使用靜態資源(應該是所有HTML內容,JS,CSS,圖像)的單一部署進行管理。

0
votes
answers
34 views
+10

如何使用JpaRepository和嵌套的對象列表進行搜索?

0

說明如何使用JpaRepository和嵌套的對象列表進行搜索?

有一個PersonRepositoryPerson實體, Person類包含List<Qualification>Qualification類有3個簡單的字段。

我嘗試添加自定義方法@Query註釋和使用JPQL得到的結果,但Qualification類領域是不可用於操縱JPQL因爲庫本身包含List<Qualification>代替的Qualification只是一個簡單的領域。

如何通過這些Qualification的嵌套字段進行搜索?

查詢

現在我需要找人實體的列表,其中合格的experienceInMonths大於3小於9和資格的名字字段='Java的。

代碼

Person.java

@Data 
@Entity 
public class Person { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private String id; 

@NotEmpty 
@Size(min = 2) 
private String name; 

@NotEmpty 
@Size(min = 2) 
private String surname; 

@ElementCollection(targetClass = java.util.ArrayList.class, fetch = FetchType.EAGER) 
private List<Qualification> qualifications = new ArrayList<>(); 

} 

PersonRepository.java

@Repository 
public interface PersonRepository extends JpaRepository<Person, String> { 
} 

Qualification.java

@Data 
@AllArgsConstructor 
public class Qualification implements Serializable { 

    @Id @GeneratedValue 
    private String id; 
    private String name; 
    private String experienceInMonths; 
} 

編輯:不重複的this post,因爲這裏是嵌套對象的集合。不只是單一的參考。

+0

的可能的複製[春季數據JPA找到嵌入對象的屬性(HTTPS ://stackoverflow.com/questions/24441411/spring-data-jpa-find-by-embedded-object-property) –

+0

正如在編輯帖子中提到的,這個問題並沒有相應的提出答案。正如你可以在粘貼的代碼中看到的那樣,對象的'List'有一個問題 - 不僅僅是其中的一個。 – DevDio

沙发
0
1

首先,將experienceInMonthsString更改爲int(否則您無法將該字符串與數字進行比較)。然後,你可以嘗試使用這個「香腸」:

List<Person> findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndName(int experienceGreater, int experienceLess, String name); 

或者你可以嘗試使用這種相當不錯的方法:

@Query("select p from Person p left join p.qualifications q where q.experienceInMonths > ?1 and q.experienceInMonths < ?2 and q.name = ?3") 
List<Person> findByQualification(int experienceGreater, int experienceLess, String name); 
+0

是否在當地爲您工作? JPQL版本給了我'org.hibernate.QueryException:不能解引用標量集合元素:'和香腸之一:'引起:java.lang.IllegalStateException:非法嘗試解引用基本類型的路徑源[null]。即使將Qualification#experienceInMonths類型更改爲'int' – DevDio

+0

@DevDio嘗試將'@ Entity'添加到'Qualification'並將'@ ElementCollection'替換爲'@ OneToMany'(類似的變體適用於我...) – Cepr0

+0

好的,終於搞定了,但它需要在Hibernate中實現單獨的'Qualification'表。其中包含FK給Person(@Entity,@ManyToOne附加字段)+ QualificationRepository是強制性的。 還測試了建議的方法,JPQL的版本工作正常,但'香腸'的名稱需要調整爲: 'findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndQualifications_Name'。 否則會搜索人名。非常感謝@ Cepr0的幫助! – DevDio

0
votes
answers
41 views
+10

分配舊的對象,以新對象的ID將將它插入重複@ManyToMany

0

我在我的類中的單向@ManyToMany關係,具體如下:分配舊的對象,以新對象的ID將將它插入重複@ManyToMany

@ManyToMany(cascade = { 
     CascadeType.MERGE, 
     CascadeType.PERSIST 
}) 
@JoinTable(
     name=TABLE_NAME_JOB_JOB_TYPE, 
     [email protected](name=COLUMN_JOB_ID, referencedColumnName = COLUMN_JOB_ID), 
     inverseJoinColumns = @JoinColumn(name=COLUMN_JOB_TYPE_ID, referencedColumnName = COLUMN_JOB_TYPE_ID) 
) 
@Fetch(FetchMode.JOIN) 
private Set<JobTypeModel> types; 

我有一個很難更新作業類型的數量,一個工作,因爲一個簡單的錯誤,我終於找到了。 但是,我不知道爲什麼會發生這種情況。

基本上,我做了什麼,是我有一個方法合併舊的和新的工作,而不是採取從newJob的一切,並添加到oldJob,我採用oldJob的ID,並將其分配給newJob 。

所以,像這樣:

public JobModel mergeAndUpdate(JobModel oldJob, JobModel newJob) { 
    getLoggerService().debug(this.getClass().getSimpleName(), "mergeAndUpdate({oldJob}, {newJob})"); 
    //newJob.setId(oldJob.getId()); //If doing this, then it fails 
    //Was trying to avoid doing this: 
    oldJob.setX(newJob.getX()); 
    oldJob.setY(newJob.getY()); 
    oldJob.setZ(newJob.getZ()); 

    return getJobRepository().saveAndFlush(oldJob); 
    //return getJobRepository().saveAndFlush(newJob); 
} 

我JobRepository是延伸org.springframework.data.jpa.repository.JpaRepository

做這件事時,試圖堅持更新(要麼加一,或一個刪除jobType)時的界面,它會失敗。

當添加一個新的jobType時,它會告訴我在關聯表JOB_JOB_TYPE中有一個重複的條目。

Hibernate: insert into job_job_type (job_id, job_type_id) values (?, ?) 
2017-11-26 00:02:28.202 WARN 74560 --- [p-nio-80-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1062, SQLState: 23000 
2017-11-26 00:02:28.202 ERROR 74560 --- [p-nio-80-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '187-2' for key 'PRIMARY' 
2017-11-26 00:02:28.203 INFO 74560 --- [p-nio-80-exec-6] o.h.e.j.b.internal.AbstractBatchImpl  : HHH000010: On release of batch it still contained JDBC statements 

從作業集中刪除jobType並保留新作業時,什麼都不會發生 - >關係仍然會保留。

有人知道爲什麼嗎?這樣做,對於沒有@ManyToMany關係的對象(即將舊對象的ID添加到新對象中,而不是將新對象中的所有其他對象添加到舊對象,都將嘗試更新,調用saveAndFlush方法時

我使用: MariaDB的28年1月10日 春季啓動1.5.4(與相關的彈簧引導啓動數據JPA)

+0

行爲對我來說是持久的,在邏輯上,您必須先刪除舊記錄(使用X id),以添加具有相同ID的新記錄。也許嘗試保存字段'整數臨時'id值,刪除舊記錄,並嘗試從'臨時'添加新的ID – newOne

+0

這意味着兩個查詢。我解決問題的方式只使用一個查詢。我只想知道爲什麼其他方法不起作用,並解釋實際發生的情況。而且由於我無法找到任何地方,這個具體問題,我認爲這也可以幫助其他人。 –

沙发
0
0

底線是DB負責。讓它爲你創建所有的ID,不要嘗試在對象上設置ID,如果你插入一個NEW記錄,你可以插入wi th null ID和DB將分配ID,並且在插入課程之前您將不知道ID。但是重要的是,如果你持久保存一個記錄,那就是HJ和ID(在POJO對象上),那麼你需要確定它正在執行'update'操作而不是'insert',否則你會遇到這個問題。

+0

當調用'saveAndFlush'時,它會進行更新。所以如果我設置了一個ID,它會進行更新。如果我從數據庫中獲取記錄,將其映射到對象,該對象還將包含一個ID。如果我更改了上述對象上的其他內容,並保持ID不變,則它會正確執行更新。但是在這裏,我們正在討論@ManyToMany關係,更新發生在父表中,但不會發生在關聯表中。 –

+1

查找「級聯」。如果沒有明顯的級聯方式,您可能需要對兩個表進行手動更新。我在@ManyToMany生鏽而在此之前 https://stackoverflow.com/questions/946938/jpa-manytomany-writing-on-create-but-not-update 都做到了和谷歌這種「彈簧更新@manytomany「:P該搜索將獲得大量命中。 – 2017-11-26 00:25:11

0
votes
answers
21 views
+10

如何配置Spring Batch的

2

春天數據流我有春天一批項目,我想在春天的雲數據流我爲能夠將其註冊在新加坡民防部隊,但在發射任務我的作業沒有運行, 以下配置它是我的配置文件如何配置Spring Batch的

@SpringBootApplication 
@EnableBatchProcessing 
@EnableTask 
public class BatchApplication { 
/*@Autowired 
BatchCommandLineRunner batchcommdrunner; 

@Bean 
public CommandLineRunner commandLineRunner() { 
    System.out.println("Executed at :" + new SimpleDateFormat().format(new Date())); 
    return batchcommdrunner ; 
}*/ 

public static void main(String[] args) { 
    SpringApplication.run(BatchApplication.class, args); 
} 
} 

這是我的批處理confriguration文件

@Configuration 
public class BatchConfiguaration { 

@Autowired 
private DataSource datasouce; 

@Autowired 
private JobBuilderFactory jobBuilderFactory; 

@Autowired 
private StepBuilderFactory stepBuilderFactory; 

@Autowired 
public Environment env; 

@Bean(name = "reader") 
@StepScope 
public ItemReader<Schedules> reader(@Value("#{stepExecutionContext[scheduleRecs]}") List<Schedules> scherecs) { 
    ItemReader<Schedules> reader = new IteratorItemReader<Schedules>(scherecs); 
    return reader; 
} 

@Bean(name = "CWSreader") 
@StepScope 
public ItemReader<Contents> CWSreader(@Value("#{stepExecutionContext[scheduleRecs]}") List<Contents> scherecs) { 
    ItemReader<Contents> reader = new IteratorItemReader<Contents>(scherecs); 
    return reader; 
} 

@SuppressWarnings("rawtypes") 
@Bean 
@StepScope 
public BatchProcessor processor() { 
    return new BatchProcessor(); 
} 

@Bean(name = "batchSchedulePreparedStatement") 
@StepScope 
public BatchSchedulePreparedStatement batchSchedulePreparedStatement() { 
    return new BatchSchedulePreparedStatement(); 
} 


@SuppressWarnings({ "rawtypes", "unchecked" }) 
@Bean(name = "batchWriter") 
@StepScope 
public BatchWriter batchWriter() { 
    BatchWriter batchWriter = new BatchWriter(); 
    batchWriter.setDataSource(datasouce); 
    batchWriter.setSql(env.getProperty("batch.insert.schedule.query")); 
    batchWriter.setItemPreparedStatementSetter(batchSchedulePreparedStatement()); 
    return batchWriter; 

} 


@Bean("acheronDbTm") 
@Qualifier("acheronDbTm") 
public PlatformTransactionManager platformTransactionManager() { 
    return new ResourcelessTransactionManager(); 
} 

@Bean 
public JobExplorer jobExplorer() throws Exception { 
    MapJobExplorerFactoryBean explorerFactoryBean = new MapJobExplorerFactoryBean(); 
    explorerFactoryBean.setRepositoryFactory(mapJobRepositoryFactoryBean()); 
    explorerFactoryBean.afterPropertiesSet(); 
    return explorerFactoryBean.getObject(); 
} 

@Bean 
public MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean() { 
    MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(); 
    mapJobRepositoryFactoryBean.setTransactionManager(platformTransactionManager()); 
    return mapJobRepositoryFactoryBean; 
} 

@Bean 
public JobRepository jobRepository() throws Exception { 
    return mapJobRepositoryFactoryBean().getObject(); 
} 

@Bean 
public SimpleJobLauncher jobLauncher() throws Exception { 
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); 
    jobLauncher.setJobRepository(jobRepository()); 
    return jobLauncher; 
} 

@Bean(name = "batchPartition") 
@StepScope 
public BatchPartition batchPartition() { 
    BatchPartition batchPartition = new BatchPartition(); 
    return batchPartition; 
} 



@Bean(name="taskExecutor") 
public TaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); 
    poolTaskExecutor.setCorePoolSize(10); 
    poolTaskExecutor.setMaxPoolSize(30); 
    poolTaskExecutor.setQueueCapacity(35); 
    poolTaskExecutor.setThreadNamePrefix("Acheron"); 
    poolTaskExecutor.afterPropertiesSet(); 
    return poolTaskExecutor; 
} 

@Bean(name = "masterStep") 
public Step masterStep() { 
    return stepBuilderFactory.get("masterStep").partitioner(slave()).partitioner("slave", batchPartition()) 
      .taskExecutor(taskExecutor()).build(); 
} 


@Bean(name = "slave") 
public Step slave() { 
    return stepBuilderFactory.get("slave").chunk(100).faultTolerant().retryLimit(2) 
      .retry(DeadlockLoserDataAccessException.class).reader(reader(null)).processor(processor()) 
      .writer(batchWriter()).build(); 

} 


@Bean(name = "manageStagingScheduleMaster") 
public Job manageStagingScheduleMaster(final Step masterStep) throws Exception { 
    return jobBuilderFactory.get("manageStagingScheduleMaster").preventRestart().incrementer(new RunIdIncrementer()) 
      .start(masterStep).build(); 
} 

誰能幫助我正確的配置它或者是有任何其他方式在那裏我可以監視我的批處理作業 我也試圖與春天開機管理員,但它在SBA是不支持Java的配置是有什麼辦法可以在XML中添加作業,而作業

我launcing從控制器這份工作

JobParametersBuilder builder = new JobParametersBuilder(); 
    System.out.println("Job Builder " + builder); 
    JobParameters jobParameters = builder.toJobParameters(); 
    JobExecution execution = jobLauncher.run(job, jobParameters); 
    return execution.getStatus().toString(); 
沙发
0
0

sample顯示可以推出作爲一個基本的春天批處理應用程序Spring雲數據流中的任務。

+0

我嘗試過這個例子,但它不能與我的作業配置類 – sourabh

+0

一起工作你能詳細說明什麼不適用於你的情況嗎?你有任何信息(如堆棧跟蹤或失敗)分享嗎? –

0
votes
answers
20 views
+10

Spring Boot/Angular應用程序。路由一個完全自包含的HTML文件

0

這看起來可能很奇怪,但我基本上想創建一個HTML文件,該文件與angular/spring啓動應用程序無關。Spring Boot/Angular應用程序。路由一個完全自包含的HTML文件

目前:

  • 的 'localhost:8080 /' ---(重定向到角應用 '/#/登錄!')

我想要什麼:

  • 'localhost:8080/angular'---(在'/#!/ login'重定向到角度應用程序)

  • 'lo calhost:8080 /「---(顯示我正常的自包含HTML文件eg'test.html」)

我很新的角度和Spring所以即使只是指導我在正確的方向將是一個巨大的幫助。

謝謝。

+1

https://github.com/angular-ui/ui-router – pegla

沙发
0
1

您應該使用ngRoute。通過「ngRoute」的禮貌,您可以通過特定的URL將用戶重定向到特定的視圖。請對此進行一些研究。假設你解決了你的觀點和重定向問題。你將如何從服務器端獲取數據?這時我建議你看看服務和工廠對象。 希望它有幫助。

示例代碼:

// create the module and name it exApp 
// also include ngRoute for all our routing needs 

var exApp= angular.module('exApp', ['ngRoute']); 

// configure our routes 
exApp.config(function($routeProvider) { 
    $routeProvider 

     // route for the home page 
     .when('/', { 
      templateUrl : 'pages/home.html', 
      controller : 'mainController' 
     }) 

     // route for the about page 
     .when('/about', { 
      templateUrl : 'pages/about.html', 
      controller : 'aboutController' 
     }) 

     // route for the contact page 
     .when('/contact', { 
      templateUrl : 'pages/contact.html', 
      controller : 'contactController' 
     }); 
}); 

// create the controller and inject Angular's $scope 
exApp.controller('mainController', function($scope) { 
    // create a message to display in our view 
    $scope.message = 'Everyone come and see how good I look!'; 
}); 

exApp.controller('aboutController', function($scope) { 
    $scope.message = 'Look! I am an about page.'; 
}); 

exApp.controller('contactController', function($scope) { 
    $scope.message = 'Contact us! JK. This is just a demo.'; 
}); 
0
votes
answers
22 views
+10

如何使用Hibernate

0

我想從表中得到一個單一的價值,但在那裏如何使用Hibernate

有錯誤報道讓我考慮一個簡單的SQL語法來獲得從表中的用戶ID。


選擇從tbl_name其中電子郵件= '[email protected]' 身份證;

現在我想返回使用用戶ID的方法冬眠

這裏是我迄今爲止

public int getIdByEmail(String email) { 
    session = sessionFact.openSession(); 
    Query query = session.createQuery("SELECT u.user_id FROM tbl_user u WHERE u.email=:emailParam"); 
    query.setParameter("emailParam", email); 
    return (int) query.uniqueResult(); 
} 

試圖User.java

@Entity 
@Table(name = "tbl_user", catalog = "lifestyle", schema = "") 
@NamedQueries({ 
    @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
    , @NamedQuery(name = "User.findByUserId", query = "SELECT u FROM User u WHERE u.userId = :userId") 
    , @NamedQuery(name = "User.findByFullName", query = "SELECT u FROM User u WHERE u.fullName = :fullName") 
    , @NamedQuery(name = "User.findByAddress", query = "SELECT u FROM User u WHERE u.address = :address") 
    , @NamedQuery(name = "User.findByContact", query = "SELECT u FROM User u WHERE u.contact = :contact") 
    , @NamedQuery(name = "User.findByGender", query = "SELECT u FROM User u WHERE u.gender = :gender") 
    , @NamedQuery(name = "User.findByDob", query = "SELECT u FROM User u WHERE u.dob = :dob") 
    , @NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email") 
    , @NamedQuery(name = "User.findByPassword", query = "SELECT u FROM User u WHERE u.password = :password") 
    , @NamedQuery(name = "User.findByActive", query = "SELECT u FROM User u WHERE u.active = :active") 
    , @NamedQuery(name = "User.findByCreatedDate", query = "SELECT u FROM User u WHERE u.createdDate = :createdDate")}) 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 

    @Column(name = "user_id") 
    private Integer userId; 

    @NotNull 
    @Size(min = 1, max = 256) 
    @Column(name = "full_name") 
    private String fullName; 
    @Size(max = 256) 
    @Column(name = "address") 
    private String address; 
    @Size(max = 30) 
    @Column(name = "contact") 
    private String contact; 
    @Size(max = 10) 
    @Column(name = "gender") 
    private String gender; 
    @Column(name = "dob") 
    @Temporal(TemporalType.DATE) 
    private Date dob; 
    // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation 

    @NotNull 
    @Size(min = 1, max = 256) 
    @Column(name = "email") 
    private String email; 

    @NotNull 
    @Size(min = 1, max = 256) 
    @Column(name = "password") 
    private String password; 

    @NotNull 
    @Column(name = "active", insertable = false) 
    private short active; 
    @Column(name = "created_date", insertable = false) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date createdDate; 

錯誤是 enter image description here

+1

它返回什麼? –

+0

@JohnJoe - 向我顯示錯誤 – Hoax

+0

爲什麼使用不推薦的專有標準API來執行此操作,而不是使用簡單的標準JPQL查詢? –

沙发
0
0

我們需要在查詢中使用實體名稱和屬性,而不是表名和列名。因此,以下查詢:

查詢的查詢= session.createQuery( 「選擇u.user_id FROM tbl_userù WHERE u.email =:emailParam」);

應該是

查詢的查詢= session.createQuery( 「選擇u.userId FROM用戶U WHERE u.email =:emailParam」);

+0

感謝您的回答 – Hoax

+1

我認爲您使用的是'SELECT u.user_id ...',但它應該是'SELECT u.userId ...'。用戶實體中的屬性名稱。 –

0
votes
answers
44 views
+10

春天 - JPA - Hibernate的如何使用EntityManager的

1

我嘗試使用以下技術堆棧來構建REST應用:春天 - JPA - Hibernate的如何使用EntityManager的

  • VueJs
  • JPA(休眠)

這是我第一次編寫Sping應用程序和Web應用程序開發的經驗。

我有4代表在我的數據庫:

  • 語言
  • 句子
  • 規則
  • 用戶

例如,在規則有:

Rule create(EntityManagerFactory factory, String type, String hint, String help, Language language); 
List<Rule> readAll(EntityManagerFactory factory); 
Rule readID(EntityManagerFactory factory, int id); 
void update(EntityManagerFactory factory, String type, String hint, String help, Language language); 

所以有我的問題:

  1. 當我創建的每個表控制器,我用的CRUD方法來修改(或沒有)我的數據庫,我返回一個觀點我HTMLVueJS一部分。但我的方法需要一個EntityManagerFactory,我應該在每個控制器類中創建一個字段,或者這不是我應該怎麼做?
  2. 我需要創建一個bean文件並配置它,或者persistence.xmlpom.xml夠了嗎?

感謝

+2

你應該看看Spring Boot。你將不需要這些CRUD方法。 https://spring.io/guides/gs/accessing-data-jpa/ –

+0

即使你不使用Spring Boot,也應該使用spring數據jpa。即使你不這樣做,你一定需要閱讀關於數據訪問和JPA集成的Spring文檔:https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access。 HTML。閱讀文檔是該工作的一部分。從長遠來看,它將爲您節省大量時間。 –

沙发
0
2

好像你的第一個問題可以分解成多個問題。

當我爲每個表創建控制器時,我使用CRUD方法來修改(或不)我的數據庫,並且爲HTML和VueJS部分返回一個視圖。但我的方法需要一個EntityManagerFactory,我應該在每個控制器類中創建一個字段,或者這不是我應該怎麼做?

由於您已經接受了建議使用spring-data-jpa的答案。您將處理實體和存儲庫。

實體是將與您的數據庫交互的JPA託管bean。

@Entity 
@Table(name = "rule") 
public class Rule { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    long id; 
    String type; 
    ... 
    @OneToOne 
    @JoinColumn(...) 
    Language language; 
} 

存儲庫將提供對數據庫執行操作所需的所有必要操作。使用JPA,您可以創建一個擴展CrudRepository的接口,它將爲您提供一些免費的CRUD操作。 findOne(/* id */)delete()save()

@Repository 
public interface RuleRepository extends CrudRepository<Rule, Long> { 

    // You can easily specify custom finders 
    public List<Rule> findByType(String type); 

} 

但我的方法需要一個EntityManagerFactory的,我應該在每個控制器類中創建一個字段或這不是我應該怎麼辦?

它通常被抱怨有一個請求/響應對象是JPA實體。請參閱鏈接的答案should i use jpa entity in rest request and/or response

您可以採取多種方法來接收控制器請求並將響應發送到客戶端項目。

@Controller 
public class RuleController { 
    @Autowired 
    private RuleRepository ruleRepository; 

    // Approach 1: Use Request Parameters - enforce inputs 
    @PostMapping("/rule/:id") 
    public Rule postWithRequestParams(@PathParam("id") Long id, 
        @RequestParam("type") String type, 
        @RequestParam("hint") String hint, 
        @RequestParam("languageField1") String languageField1) { 
     Rule inputRule = new Rule(id, type, hint, new Language(languageField1)); 

     Rule responseRule = ruleRepository.save(inputRule); 
     return responseRule; // I would imagine you would want to set up a model for the response itself 
    } 



    // Approach 2: Use RequestBody - serialize Rule from the request 
    @PostMapping("/rule/:id") 
    public Rule postWithRequestParams(@PathParam("id") Long id, @RequestBody Rule inputRule) { 
     Rule responseRule = ruleRepository.save(inputRule); 
     return responseRule; 
    } 

我需要創建一個bean文件,並配置它或persistence.xml中和pom.xml的是夠不夠?

如果已經添加spring-boot-starter-data-jpa作爲依賴,很多bean配置中已經爲你做。

在你main/src/resources(你應該有一個application.propertiesapplication.yml

spring.datasource.url= # JDBC url of the database. 
spring.datasource.username= # Login user of the database. 
spring.datasource.password= # Login password of the database. 

春天做了很多的魔術和繁重的你。

+0

我還有一個問題,在我的方法控制器中,是否必須返回關聯的視圖或ModelMap?(如果我不返回它,視圖可以訪問ModelMap)因爲我不知道是否讓控制器猜測他指的是哪個視圖是一種好方法。 – Unconnu

+0

這可能需要另一個問題。 – shinjw

板凳
0
0

你一定要對Spring Boothttp://start.spring.io)一看,使得更容易啓動Web應用程序的開發。至於持久層,您可以使用Spring Data JPA(已包含Hibernate)模塊,該模塊也可以輕鬆與Spring Boot集成。春天數據的美麗已經寫在默認情況下大多數查詢如save(), remove(), find()等等。你只需要定義將被Spring Data使用的對象。

更新:如果您使用的春天啓動,那麼你就不需要實體管理器中看到我的春節,引導REST API例如here

地板
0
2

。你所要做的就是在你的屬性文件中定義數據源。而在我們的配置類中創建一個Bean就像:

@Bean 
@Primary 
@ConfigurationProperties(prefix = "spring.datasource") 
public DataSource datasource() { 
    return DataSourceBuilder.create().build(); 
} 

現在的你可以用repositories.They處理剩下的事情會像:

import org.springframework.data.repository.CrudRepository; 

public interface RuleRepository extends CrudRepository<Rule, Long> { 

} 

在你的控制器,你會用它喜歡:

@Autowired 
private RuleRepository ruleRepository; 

@Get 
@Path("/getRule/:id") 
public Rule find(@PathParam("id")Long id){ 
    return ruleRepository.findOne(id); 
} 

這些依賴關係我在我的gradle項目中使用。你會發現相同的Maven版本:

compile('org.springframework.boot:spring-boot-starter-data-jpa') 
compile group: 'mysql', name: 'mysql-connector-java' 
+0

這是spring-data-jpa。您可能希望將相關依賴項包含在您的答案中。 – shinjw

+0

謝謝,我用依賴關係更新了它。 –

0
votes
answers
18 views
+10

我需要一個REST URL我需要執行使用REST API我需要客戶端代碼我的代碼是這樣

-1

@RequestMapping刪除操作(值=「/ RemoveOneSubject」,方法= RequestMethod.POST) 公共的ModelAndView RemoveOneSubject(HttpServletRequest的請求)拋出IOException異常{我需要一個REST URL我需要執行使用REST API我需要客戶端代碼我的代碼是這樣

 ModelAndView model = new ModelAndView("RemoveOneSubject"); 

    final String uri = "http://localhost:8080/subject/api/remove/{id}"; 


       String id = request.getParameter("id"); 
       RestTemplate restTemplate = new RestTemplate(); 
       restTemplate.delete (uri,id); 

       model.addObject("theSubject", id); 

      return model; 


enter code herejsp is 

刪除

<table id="myTable" class="table table-striped"> 
       <thead> 
        <tr> 
         <th></th> 
         <th>Name</th> 
         <th>Created by</th> 
         <th>Created time</th> 
</td></th> 
        </tr> 
       </thead> 
       <tbody> 
       <c:if test="${not empty theSubject}"> 
        <c:forEach var="listValue" items="${theSubject}"> 
        <tr> 
         <td><input type="checkbox" name="chkBox"></td> 
         <td><a href=""><c:out value="${listValue.name}" /></a></td> 
         <td><c:out value="${listValue.createdBy}" /></td> 
         <td><c:out value="${listValue.createTime}" /></td>      
         <td><c:out value="${listValue.studentID}"></c:out></td>      </tr> 
        </c:forEach> 
       </c:if> 
       </tbody> 
      </table> 
+1

請閱讀[mcve]並相應地提高您的問題。並提示:預覽窗口存在的原因。您希望我們花時間幫助您解決問題,因此您請花時間編寫格式良好的人性化問題。 – GhostCat

沙发
0
0

進行刪除。在RestController中已經有刪除方法。您實際上可以使用獲取方法,方法簡單,不是最佳實踐。但是,您可以使用此代碼刪除整個控制器中的某些內容。

@RestController 
@RequestMapping(value = "/api") 
public class ApiCodeController { 

    @RequestMapping(method = RequestMethod.GET, value = "/delete") 
    public string DeleteSomething(@RequestParam(required = false) String email) 
    { 
     //Do Something with your code to delete an object 
    } 
} 

你只需要調用它。

/api?delete=your-parameter 

希望它會幫。

+0

我需要使用rest url執行從jsp頁面刪除一行在jsp中需要哪些更改 – user3578232

0
votes
answers
26 views
+10

未能在對象轉換爲json的過程中懶惰地初始化一個角色集合

0

我是新來的spring,同時從表中獲取記錄與其他表有關係得到這個懶洋洋的初始化錯誤。 我已經在網上閱讀了很多,但沒有得到適當的方法。未能在對象轉換爲json的過程中懶惰地初始化一個角色集合

表1:

@SuppressWarnings("serial") 
@Entity 
public class Terminal extends BaseEntity { 

@Column(length = 100, unique = true) 
private String shortName; 

@Column 
private short number; // short stores up to 32767 value 

@Column 
private String description;  

@OneToMany 
@JoinColumn(name = "terminal_id", referencedColumnName = "uuid") 
@Cascade({ CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DELETE }) 
private Set<BusinessHour> businessHour; 

public String getShortName() { 
    return shortName; 
} 

public void setShortName(String shortName) { 
    this.shortName = shortName; 
} 

public short getNumber() { 
    return number; 
} 

public void setNumber(short number) { 
    this.number = number; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 
public Set<BusinessHour> getBusinessHour() { 
    return businessHour; 
} 

public void setBusinessHour(Set<BusinessHour> businessHour) { 
    this.businessHour = businessHour; 
} 

表2:

@SuppressWarnings("serial") 
@Entity 
public class BusinessHour extends BaseEntity { 

@Column 
private DayOfWeek dayOfWeek; 

@Column 
private LocalTime startOfOperation; 

@Column 
private LocalTime endOfOperation; 

public DayOfWeek getDayOfWeek() { 
    return dayOfWeek; 
} 
} 

服務代碼:

@Service 
public class TerminalServiceImpl implements TerminalService { 

@Autowired 
TerminalRepository terminalRepository; 


    Iterable<Terminal> allTerminals = terminalRepository.findAll(); 
    List<Terminal> terminalList = new ArrayList<Terminal>(); 
    for (Terminal terminal : allTerminals) { 
     terminalList.add(terminal); 
    } 
    return terminalList; 
} 

終端資源庫合作德:在這裏我調試過程中遇到錯誤

@Transactional 
public interface TerminalRepository extends CrudRepository<Terminal, Long> { 
} 

代碼:

private List<Terminal> updateTerminalList() { 
    List<Terminal> allTerminals = terminalService.fetchAllTerminal(); 
    return allTerminals; 
} 

public void terminalWrapperRun() { 
    try { 
     Payload payload = createTerminalPayload(applicationId); 
     String json3 = object2Json(payload); 
     kafkaRESTUtils.sendServerPayload(json3); 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    } 
} 

public String object2Json(Object dataArray) throws JsonProcessingException { 
    return mapper.writeValueAsString(dataArray); 
} 

錯誤:

com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: terminal.model.Terminal.businessHour, could not initialize proxy - no Session (through reference chain: 

獲取異常而取對象轉換爲JSON。我發現由於代理對象返回由於提取類型懶惰(我想保持原樣)。

+0

的可能的複製[org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話?](https://stackoverflow.com/questions/22439306/org-hibernate-lazyinitializationexception-could-not-initialize-proxy -no-sessi) –

沙发
0
0

我相信這個問題與您的ORM默認的LAZY集合加載有關。

@OneToMany 
@JoinColumn(name = "terminal_id", referencedColumnName = "uuid") 
@Cascade({ CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DELETE }) 
private Set<BusinessHour> businessHour; 

@OneToMany註釋具有fetch屬性,默認情況下該屬性設置爲LAZY。

FetchType fetch() default LAZY; 

OneToMany reference

這意味着,當該數據被存取它只會被加載。在你的例子中,當你嘗試創建JSON字符串時會發生這種情況。但是,由於這一點,你不在ORM會話的範圍之內,所以它不知道如何加載數據。

因此你有2個選項。

  1. 更改您的註釋到熱切加載數據(這意味着BusinessHour集將在同一時間作爲父對象

    @OneToMany(取= FetchType.EAGER)

  2. 被加載在ORM會話中執行你的JSON生成(我只會真正推薦這樣做是導致性能問題的第一個選項)

+0

如何在ORM會話中生成json可以協助嗎? – Rishabh

+1

簡要地看一下所提供的代碼,我認爲實現這一目標的最簡單方法是在生成JSON的方法周圍引入一個Transactional註釋。這應該在所需的會話中執行代碼。話雖如此,我認爲這會給代碼帶來誤導性的表示。也許調用JSON代之前,你應該出臺哪些初始化使用businessHour設置一個單獨的方法 同樣,Hibernate.initialize(terminal.getBusinessHour()) – PillHead

板凳
0
0

如果我reca這正是Entity在使用時從EntityManager中分離出來的一種錯誤(它是一個Proxy它無法執行數據庫查詢來檢索數據)。

您可以使用:

@OneToMany(fetch = FetchType.EAGER) 
... 
private Set<BusinessHour> businessHour; 
+0

我不想使用fetchType急於 我們可以有其他的方式來做到這一點 – Rishabh

+0

爲什麼?幾乎沒有任何性能損失,而且您不必更復雜。 Imho這是一個更清潔的解決方案 – LppEdd

地板
0
0

使用FetchType = EAGER意味着對你的實體的任何查詢將加載一大堆註明實體的。

Imho,如果您100%確定您的實體僅用於您的特殊業務案例,這只是一個明智的行爲。在所有其他情況下 - 比如將數據庫編程爲庫,或接受對實體的不同類型的查詢,您應該使用實體圖(https://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs002.htm)或顯式加載(Hibernate.initialize,join-fetch,請參閱示例https://vladmihalcea.com/hibernate-facts-the-importance-of-fetch-strategy/)。

如果您的使用情況下,僅是轉換,你有兩個很好的選擇:

  • 一個事務性方法內將您的實體JSON(如PillHead建議)
  • 與所有實體明確裝入實體在事務中需要(通過實體圖或Hibernate.initialize),然後在需要它的地方轉換爲JSON。